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 来实现。
我有三个 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 来实现。