Java - создание согласованности между двумя переменными в отдельных классах - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть три класса: пользователь, этаж и каталог.

Каталог содержит / создает несколько статических объектов 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)....
  }

}

С классом User, подобным этому:

public class User{

  private Floor floor;

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

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

Вопрос: Я хочу убедиться, что информация, хранящаяся в моих объектах «Пользователь» и «Этаж», всегда соответствует друг другу, чтобы все пользователи знали, на каком этаже они находятся, и все этажи знают, кто на них. Для этого сеттеры должны позвонить друг другу. Как мне сделать это без создания бесконечного цикла? Это кажется достаточно распространенной проблемой, и я предполагаю, что для нее существует стандартный формат, но я не знаю, что это такое.

1 Ответ

0 голосов
/ 08 ноября 2018

Один из вариантов - иметь отдельный класс для представления местоположения пользователей - отношение между полом и пользователями.

Этот класс может быть Directory или новым классом, экземпляр которого содержит каталог.

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 ) { ... }

    ...
}

Для коллекций, указанных выше, необходимо указать equals() и hashCode() для Пола и Пользователя. В качестве альтернативы вы можете использовать идентификаторы этажей и идентификаторы пользователей.

При необходимости, Этажи и Пользователи могут поделиться ссылкой на LocationMap. В качестве альтернативы, если для определения местоположения пользователя требуется только код, внешний по отношению к этим классам, он может сделать это напрямую через LocationMap.

...