Сделать неизменяемый объект Java



моя цель-сделать объект Java неизменяемые. У меня есть класс Student. Я закодировал его следующим образом для достижения неизменности:



public final class Student {

private String name;
private String age;

public Student(String name, String age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public String getAge() {
return age;
}

}


мой вопрос в том, что является лучшим способом достижения неизменности для Student класса?

673   14  

14 ответов:

ваш класс не является неизменным строго говоря, он только фактически неизменен. Чтобы сделать его неизменным, вам нужно использовать final:

private final String name;
private final String age;

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

есть несколько вещей, которые вы должны рассмотреть для принятия неизменяемый класс:

  • сделать свой класс final - у вас уже есть
  • сделать все поля private и final - внесите соответствующие изменения в свой код
  • не предоставляйте никаких методов, которые изменяют состояние вашего экземпляра
  • если у вас есть изменяемые поля в вашем классе, как List или Date, делая из них final не хватит. Вы должны вернуться в оборону копия с их getters, чтобы их состояние не мутировало при вызове методов.

для 4-го пункта, скажем, у вас есть

С final ключевые слова:

private final String name;
private final String age;

создание частных переменных и отсутствие методов сеттера будет работать для примитивных типов данных. Если мой класс имеет какую-либо коллекцию объектов?

чтобы сделать любой класс неизменяемым с объектом коллекции?

напишите свой собственный объект коллекции с классом extends collection и следуйте частным переменным и никаким методам setter. или возвратите объект клонирования вашего объекта коллекции.

public final class Student {

private StudentList names;//Which is extended from arraylist

public Student() {
names = DAO.getNamesList()//Which will return All Student names from Database  its upto you how you want to implement.
}

public StudentList getStudentList(){
return names;//you need to implement your own methods in StudentList class to iterate your arraylist; or you can return Enumeration object.
}

public Enumeration getStudentNamesIterator(
Enumeration e = Collections.enumeration(names);
return e;
}

public class StudentList extends ArrayList {

}

- Это хорошо, но я бы сделал поля final Как хорошо.

также я бы сделал возраст int или double, а не строку.

ваш пример уже является неизменяемым объектом, потому что поля в классе Student могут быть установлены только при инициализации экземпляра.

чтобы сделать объект неизменяемым, вам необходимо выполнить следующие действия:

  1. Не используйте никаких методов, которые могут изменить поля вашего класса. Например, не используйте сеттеры.
  2. избегайте использования общественных полей. Если ваши поля являются общедоступными, вы должны объявить их как окончательные и инициализировать их в конструкторе или непосредственно в объявлении линия.
  1. объявите класс окончательным, чтобы он не мог быть расширен.
  2. сделайте все поля закрытыми, чтобы прямой доступ был запрещен.
  3. не предоставляйте методы сеттера для переменных
  4. сделать все изменяемые поля финале, так что это значение может быть присвоено только один раз.
  5. инициализируйте все поля с помощью конструктора, выполняющего глубокое копирование.
  6. выполните клонирование объектов в методах getter для возврата копии, а не фактического ссылка на объект.

источник

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

  1. состояние неизменяемого объекта не может быть изменено после построения, любая модификация должна привести к новому неизменяемому объекту.
  2. все поля неизменяемого класса должны быть окончательными.
  3. объект должен быть правильно построен, т. е. ссылка на объект не должна подтекать в процессе строительства.
  4. объект должен быть окончательным, чтобы ограничить подкласс для изменение неизменности родительского класса.

Я думаю, что эта ссылка поможет больше Читайте также: http://javarevisited.blogspot.com/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html#ixzz40VDQDDL1

расширяясь на ответ немного.

final - Это не то же самое как Immutable но вы можете использовать final чтобы сделать некоторые вещи неизменными, если вы используете его определенным образом.

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

поэтому, чтобы сделать что-то действительно неизменным, вам нужно убедиться, что final используется полностью, пока вы не достигнете каждого поля, достигающего каждого значения в основании вашего дерева композиции. В противном случае что-то может измениться из-под вашего объекта, и он не является полностью неизменным.

Он уже неизменен - вы не можете изменить содержимое после его инициализации, так как вы не сделали сеттеры. Вы можете добавить ключевые слова к переменным.

делая все переменные как final и при установке некоторого поля, что делает его вернуть ссылку на новый Student объект с вновь установленным значением, как в String.

вы можете просто следовать рекомендациям, показанным в этом примере (первый результат в google): http://www.javapractices.com/topic/TopicAction.do?Id=29

вот несколько правил, которые помогают сделать неизменяемый класс в Java : 1. Состояние неизменяемого объекта не может быть изменено после построения, любая модификация должна привести к новому неизменяемому объекту. 2. Все поля неизменяемого класса должны быть окончательными. 3. Объект должен быть правильно построен, т. е. ссылка на объект не должна протекать во время процесса строительства. 4. Объект должен быть конечным, чтобы ограничить подкласс для изменения неизменности родителя класс.

пример:

public final class Contacts {

private final String name;
private final String mobile;

public Contacts(String name, String mobile) {
    this.name = name;
    this.mobile = mobile;
}

public String getName(){
    return name;
}

public String getMobile(){
    return mobile;
}

}

см. эту ссылку : http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

сделать класс или переменную как окончательный это более чем достаточно

Public final class constants
{
  private final String name;
  private final String mobile;

  // code
}

Comments

    Ничего не найдено.