Java- 在单独的 类 中创建两个变量之间的一致性

Java- Creating Consistency Between Two Variable in Separate Classes

我有三个 classes- 用户、楼层和目录。

目录holds/creates 多个静态 Floor 对象。

每个用户对象以及其他信息都需要知道他们所在的楼层。

每个楼层连同其他信息都需要知道其中有哪些用户。

我想做这样的事情:

public class Directory{

  public static Floor floor1 = new Floor(3);
  public static Floor floor2 = new Floor(3);

  class Floor{

     private User[] users;

     private Floor(int allowedUsers){
        users = users[4];
     }

     public boolean addUser(User toAdd){
        // if there is a free slot on floor, add User
        for(int i = 0; i < users.length; i++){
           if(users[i] == null){
              users[i] = toAdd;
              return true;
           }
        }
        return false;
     }
           ....(other Floor methods)....
  }

}

像这样的用户 class:

public class User{

  private Floor floor;

  public boolean setFloor(Floor floor){
     // some code here
     // returns true if floor successfully added
  }

     ....(other User methods)....
}

问题: 我想确保我的 User 和 Floor 对象持有的信息始终相互一致,以便所有用户都知道他们在哪个楼层,所有楼层都知道他们在什么用户。为此,setter 需要相互调用。如何在不创建无限循环的情况下执行此操作?这似乎是一个很常见的问题,我认为它有一个标准格式,但我不知道它是什么。

一个选择是用一个单独的 class 来表示用户的位置 -- 楼层和用户之间的 关系

那个 class 可能是 Directory 本身,或者一个新的 class,那个目录拥有一个实例。

public class LocationMap {
    private Map<Floor,Set<User>> = new HashMap<>(); 
    private Map<User,Floor> = new HashMap<>();

    public @CheckForNull Floor getFloorOf( @Nonnull User user ) { ... }

    public @CheckForNull Set<User> getUsersOn( @Nonnull Floor floor ) { ... }

    ...
}

上述集合需要在 Floor 和 User 上定义 equals()hashCode()。或者,您可以使用楼层 ID 和用户 ID。

如有必要,楼层和用户可以共享对 LocationMap 的引用。或者,如果只有这些 classes 外部的代码需要定位用户,它可以直接通过 LocationMap 来实现。