Почему этот класс не является неизменным? - PullRequest
4 голосов
/ 29 апреля 2020

Сегодня у меня было Java интервью, и меня попросили создать неизменный класс с именем Person, и мне дали скелет с некоторыми параметрами: возраст, имя и т. Д. c. Я создал следующий класс:

final class Person {
  private final int age;
  private final String name;
  private final List<String> petNames;


  public Person(int a, String n, List<String> p) {
    this.age = a;
    this.name = n;
    this.petNames = p;
  }

  int getAget() {
    return this.age;
  }

  String getName() {
    return this.name;
  }

  List<String> getPetnames() {
    return this.petNames;
  }

}

Мне сказали, что он неполон, потому что, выполнив приведенную ниже последовательность кода, вы докажете, что он не является неизменным:

int x = 3;
String name = "Alex";
List<String> ls = new ArrayList<>();
Person p1 = new Person(x, name, ls);

намек на то, что он связан со списком, и что я должен изменить sth в конструкторе. Но я действительно не знаю, почему, и я не понимаю, что не так.

Может кто-нибудь объяснить мне, что следует добавить и почему? Может быть, я не совсем понял неизменность.

Ответы [ 2 ]

6 голосов
/ 29 апреля 2020

Я предполагаю, что они попросили вас сохранить неизменную копию данной коллекции домашних животных.

this.petNames = List.copyOf(p);

В противном случае вы все равно сможете изменить домашних животных человека.

p1.getPetnames().add("newPet");

Вам не нужно беспокоиться о том, что произойдет с ls, но вы должны позаботиться о том, что вы можете сделать с p1.

  1. Вы делаете копия, чтобы не беспокоиться о том, будет ли изменен ввод через некоторое время.
  2. Вы делаете коллекцию неизменной, что, наряду с 2 последними простыми полями, делает класс неизменным.
4 голосов
/ 29 апреля 2020

Чтобы сделать список неизменным, я считаю, что вы должны использовать

       this.petnames=  ImmutableList.copyOf(p);

или

     this.petnames  = Collections.unmodifiableList(new ArrayList<>(p));

В java 9 вы можете использовать метод copyOf () для создания неизменяемого списка

 this.petnames = List.copyOf(p)

Если вы вернете это, то невозможно добавить или удалить элементы к нему. Тем не менее, они могут получить элементы из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...