Нераспознанный селектор отправлен на экземпляр 0x108b08740

Минимизировать изменчивость

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

JDK неизменяемые классы: String, классы в штучной упаковке (классы-оболочки), BigInteger и BigDecimal и т. Д. .

Как сделать класс неизменным?

  1. Не предоставлять какие-либо методы, которые изменяют состояние объекта (известные как мутаторы).
  2. Обеспечить что класс не может быть расширен.
  3. Сделать все поля окончательными.
  4. Сделать все поля закрытыми. Это не позволяет клиентам получить доступ к изменяемым объектам, на которые ссылаются поля, и напрямую изменять эти объекты.
  5. Сделать защитные копии. Обеспечьте эксклюзивный доступ к любым изменяемым компонентам. public list getList () {return Collections.unmodifiableList (список); & lt; === защитная копия изменяемого поля перед возвратом его вызывающему абоненту}

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

import java.util.Date;
public final class ImmutableClass {

       public ImmutableClass(int id, String name, Date doj) {
              this.id = id;
              this.name = name;
              this.doj = doj;
       }

       private final int id;
       private final String name;
       private final Date doj;

       public int getId() {
              return id;
       }
       public String getName() {
              return name;
       }

     /**
      * Date class is mutable so we need a little care here.
      * We should not return the reference of original instance variable.
      * Instead a new Date object, with content copied to it, should be returned.
      * */
       public Date getDoj() {
              return new Date(doj.getTime()); // For mutable fields
       }
}
import java.util.Date;
public class TestImmutable {
       public static void main(String[] args) {
              String name = "raj";
              int id = 1;
              Date doj = new Date();

              ImmutableClass class1 = new ImmutableClass(id, name, doj);
              ImmutableClass class2 = new ImmutableClass(id, name, doj);
      // every time will get a new reference for same object. Modification in              reference will not affect the immutability because it is temporary reference.
              Date date = class1.getDoj();
              date.setTime(date.getTime()+122435);
              System.out.println(class1.getDoj()==class2.getDoj());
       }
}

Для получения дополнительной информации см. Мой блог: http: //javaexplorer03.blogspot. в / 2015/07 / минимизации-mutability.html

0
задан onnoweb 28 February 2019 в 19:01
поделиться