Как создать неизменяемые объекты в Java? - PullRequest
80 голосов
/ 10 июня 2011

Как создать неизменяемые объекты в Java?

Какие объекты следует называть неизменяемыми?

Если у меня есть класс со всеми статическими членами, является ли он неизменным?

Ответы [ 13 ]

1 голос
/ 23 октября 2013

Неизменяемые объекты - это те объекты, состояние которых нельзя изменить после их создания, например, класс String является неизменяемым классом.Неизменяемые объекты не могут быть изменены, поэтому они также являются поточно-ориентированными при параллельном выполнении.

Особенности неизменяемых классов:

  • простая конструкция
  • автоматически поточно-безопасная
  • хороший кандидат на ключи Map и Set, поскольку их внутреннее состояние не изменится при обработке
  • не требуется реализация клона, поскольку они всегда представляют одно и то же состояние

Ключи длянапишите неизменный класс:

  • убедитесь, что класс не может быть переопределен
  • сделайте все переменные-члены частными и окончательными
  • не передавайте их методы установки
  • ссылка на объект не должна вытекать на этапе строительства
1 голос
/ 31 июля 2013

объект называется неизменным, если его состояние не может быть изменено после создания.Один из самых простых способов создания неизменяемого класса в Java - это установка всех его полей в окончательный.Для сохранения неизменности в таких случаях рекомендуется вернуть копию оригинального объекта,

0 голосов
/ 26 июля 2018

Обычно игнорируемые, но важные свойства неизменяемых объектов

В дополнение к ответу, предоставленному @ nsfyn55, необходимо учитывать следующие аспекты неизменяемости объектов, которые имеют простое значение.

Рассмотрим следующие классы:

public final class ImmutableClass {

  private final MutableClass mc;

  public ImmutableClass(MutableClass mc) {
    this.mc = mc;
  }

  public MutableClass getMutClass() {
    return this.mc;
  }
}

public class MutableClass {

  private String name;

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }
}


public class MutabilityCheck {

public static void main(String[] args) {

  MutableClass mc = new MutableClass();

  mc.setName("Foo");

  ImmutableClass iMC = new ImmutableClass(mc);

  System.out.println(iMC.getMutClass().getName());

  mc.setName("Bar");

  System.out.println(iMC.getMutClass().getName());

  }

 }

Ниже будет вывод из MutabilityCheck:

 Foo
 Bar

Важно отметить, что

  1. Построение изменяемых объектов на неизменяемом объекте (через конструктор), либо «копированием» , либо «закрытием» переменных экземпляра неизменяемого объекта, описываемых следующимизменения:

    public final class ImmutableClass {
    
       private final MutableClass mc;
    
       public ImmutableClass(MutableClass mc) {
         this.mc = new MutableClass(mc);
       }
    
       public MutableClass getMutClass() {
         return this.mc;
       }
    
     }
    
     public class MutableClass {
    
      private String name;
    
      public MutableClass() {
    
      }
      //copy constructor
      public MutableClass(MutableClass mc) {
        this.name = mc.getName();
      }
    
      public String getName() {
        return this.name;
      }
    
      public void setName(String name) {
       this.name = name;
      } 
     }
    

по-прежнему не обеспечивает полную неизменность, поскольку из класса MutabilityCheck по-прежнему действует следующее:

  iMC.getMutClass().setName("Blaa");

Тем не менее, запуск MutabilityCheck с изменениями, сделанными в 1., приведет к выводу:

Foo
Foo

Для достижения полной неизменности на объекте всеего зависимые объекты также должны быть неизменными

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