как сделать непримитивный член класса неизменяемым

#java #immutability

#java #неизменность

Вопрос:

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

при создании неизменяемого класса у меня есть непримитивный член. как я могу сделать этот член неизменяемым.хотя в его собственной реализации он не является неизменяемым, например

 public Class A{
private final int  immutableInt;
private final String immutableString;
private final Employee toBeMadeImmutable

// individual getters

}
  

нет, если использовать средство получения для «toBeMadeImmutable», я получу его объект, я могу делать с этим объектом все, что угодно, чтобы он был изменяемым, что не требуется.

как можно добиться неизменности для непримитивного члена

Комментарии:

1. Employee класс также должен быть неизменяемым.

2. final Не выполняет этого?

3. @jhobbie нет, это означает, что toBeMadeImmutable ссылка не может быть изменена, но данные, которые содержит эта ссылка, все еще могут быть изменены.

4. Именно то, что говорит Postmind. Для этого каждая переменная внутри объекта должна быть окончательной.

Ответ №1:

Java не предоставляет встроенной поддержки неизменности.

Вы можете сделать поля неизменяемыми, создав их setters private и предоставив только их getters as public методы.

Кроме того, неизменяемость не может быть достигнута путем объявления переменной как final . объявляя переменную как final , вы указываете, что не будете изменять объект, на который указывает ссылка. Вы все равно можете изменить состояние объекта (изменив его поля), на который указывает ссылка.

Комментарии:

1. Не нужно кричать. Нет необходимости форматировать не-код как код.

2. Вы можете усилить текст, обернув его с помощью double * вот так . Если вы используете один * для переноса текста, он будет выделен курсивом .

3. -1 OP заявил о своем беспокойстве по поводу предоставления ссылки через средство получения и о том, что вызывающий может использовать эту ссылку для изменения состояния. Я считаю, что ответы клона лучше отвечают на вопрос.

Ответ №2:

Если одно из ваших полей не является неизменяемым, будет сложно сделать ваш объект неизменяемым. Можно приблизиться, если вы сделаете защитную копию:

 Employee getEmployee() {
    return new Employee(toBeMadeImmutable);
}
  

Где конструктор создает нового сотрудника с теми же значениями.

Ответ №3:

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