Неизменяемый class?

Как можно сделать class Java неизменным, какова потребность в неизменности и есть ли какое-то преимущество в использовании этого?

Что такое неизменяемый объект?

Неизменяемым объектом является тот, который не изменит состояние после его создания.

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

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

Следующий class создаст неизменяемый объект:

 class ImmutableInt { private final int value; public ImmutableInt(int i) { value = i; } public int getValue() { return value; } } 

Как видно из приведенного выше примера, значение ImmutableInt может быть установлено только при создании экземпляра объекта и при наличии только геттера ( getValue ) состояние объекта не может быть изменено после создания экземпляра.

Тем не менее, необходимо проявлять осторожность, чтобы все объекты, на которые ссылается объект, также должны быть неизменными, или можно было бы изменить состояние объекта.

Например, позволяя получить ссылку на массив или ArrayList получаемый с помощью геттера, позволит изменять внутреннее состояние путем изменения массива или коллекции:

 class NotQuiteImmutableList { private final List list; public NotQuiteImmutableList(List list) { // creates a new ArrayList and keeps a reference to it. this.list = new ArrayList(list); } public List getList() { return list; } } 

Проблема с приведенным выше кодом заключается в том, что ArrayList можно получить с помощью getList и манипулировать, что приведет к изменению состояния самого объекта, поэтому он не является неизменным.

 // notQuiteImmutableList contains "a", "b", "c" List notQuiteImmutableList= new NotQuiteImmutableList(Arrays.asList("a", "b", "c")); // now the list contains "a", "b", "c", "d" -- this list is mutable. notQuiteImmutableList.getList().add("d"); 

Один из способов обойти эту проблему – вернуть копию массива или коллекции при вызове из получателя:

 public List getList() { // return a copy of the list so the internal state cannot be altered return new ArrayList(list); } 

В чем преимущество неизменности?

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

Имея неизменный объект, можно гарантировать, что все streamи, которые смотрят на объект, будут видеть одно и то же состояние, так как состояние неизменяемого объекта не изменится.

В дополнение к уже полученным ответам я бы рекомендовал прочитать о неизменности в Effective Java, 2nd Ed., Так как есть некоторые детали, которые легко пропустить (например, защитные копии). Кроме того, эффективная Java 2nd Ed. является обязательным для каждого разработчика Java.

Неизменность может быть достигнута главным образом двумя способами:

  • используя атрибуты final экземпляров, чтобы избежать переназначения
  • используя интерфейс classа, который просто не позволяет выполнять какую-либо операцию, которая может изменить то, что находится внутри вашего classа (просто геттеры и нет сеттеров

Преимущества неизменности – это предположения, которые вы можете сделать на этих объектах:

  • вы получаете правило без побочных эффектов (которое действительно популярно на языках функционального программирования) и позволяет вам использовать объекты в параллельной среде проще, поскольку вы знаете, что они не могут быть изменены атомарным или неатомным способом, когда они используется многими streamами
  • реализации языков могут обрабатывать эти объекты по-другому, помещая их в зоны памяти, которые используются для статических данных, что позволяет быстрее и безопаснее использовать эти объекты (это то, что происходит внутри JVM для строк)

Вы делаете class неизменным следующим образом:

 public final class Immutable { private final String name; public Immutable(String name) { this.name = name; } public String getName() { return this.name; } // No setter; } 

Неизменяемые classы полезны, потому что они streamобезопасны. Они также выражают что-то глубокое в вашем дизайне: «Не могу изменить это». Когда это применимо, это именно то, что вам нужно.

Q1) Что такое неизменяемый class и объект?

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

Q2) Как создать неизменяемый class?

Ans) Чтобы создать неизменяемый class, выполните следующие шаги:

  • Создайте последний class.

  • Задайте значения свойств, используя только конструктор.

  • Сделать свойства classа final и private

  • Не предоставляйте никаких приспособлений для этих свойств.

  • Если поля экземпляра include ссылки на изменяемые объекты, не разрешайте изменять эти объекты:

    • Не предоставляйте методы, изменяющие изменяемые объекты.

    • Не используйте ссылки на изменяемые объекты. Никогда не храните ссылки на внешние, изменяемые объекты, переданные конструктору; при необходимости, создавать копии и хранить ссылки на копии. Аналогичным образом создайте копии своих внутренних изменяемых объектов, когда это необходимо, чтобы избежать возврата оригиналов в ваши методы.

Неизменяемые classы не могут переназначать значения после его создания. Конструктор присваивает значения своим частным переменным. Пока объект не станет пустым, значения не могут быть изменены из-за недоступности методов setter.

быть непреложным, должно удовлетворять следующему,

  • Al переменные должны быть частными .
  • Никаких мутаторных методов (сеттеров) не предусмотрено.
  • Избегайте переопределения методов, делая окончательный class (Сильная неизменность) или окончательный метод (Непрерывность недели).
  • Клон глубоко, если он содержит не примитивные или изменяемые classы.

 /** * Strong immutability - by making class final */ public final class TestImmutablity { // make the variables private private String Name; //assign value when the object created public TestImmutablity(String name) { this.Name = name; } //provide getters to access values public String getName() { return this.Name; } } 

Advanteges: неизменяемые объекты содержат свои инициализированные значения до тех пор, пока они не умрут.

Java-неизменные-classы, краткосрочные примечание

Неизменяемым classом являются те, чьи объекты не могут быть изменены после создания.

Неизменяемые classы полезны для

  • цель кэширования
  • Параллельная среда (ThreadSafe)

  • Трудно наследовать

  • Значение не может быть изменено в любой среде

пример

Строковый class

Пример кода

 public final class Student { private final String name; private final String rollNumber; public Student(String name, String rollNumber) { this.name = name; this.rollNumber = rollNumber; } public String getName() { return this.name; } public String getRollNumber() { return this.rollNumber; } } 

Другой способ создания неизменяемого объекта – использование библиотеки Immutables.org :

Предполагая, что необходимые зависимости были добавлены, создайте абстрактный class с абстрактными методами доступа. Вы можете сделать то же самое, аннотируя с помощью интерфейсов или даже аннотаций (@interface):

 package info.sample; import java.util.List; import java.util.Set; import org.immutables.value.Value; @Value.Immutable public abstract class FoobarValue { public abstract int foo(); public abstract String bar(); public abstract List buz(); public abstract Set crux(); } 

Теперь можно сгенерировать, а затем использовать сгенерированную неизменяемую реализацию:

 package info.sample; import java.util.List; public class FoobarValueMain { public static void main(String... args) { FoobarValue value = ImmutableFoobarValue.builder() .foo(2) .bar("Bar") .addBuz(1, 3, 4) .build(); // FoobarValue{foo=2, bar=Bar, buz=[1, 3, 4], crux={}} int foo = value.foo(); // 2 List buz = value.buz(); // ImmutableList.of(1, 3, 4) } } 

Вопрос: Что такое неизменяемый class?

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

В: Как создать неизменяемый class?

Чтобы создать неизменяемый class, вы должны выполнить следующие шаги:

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

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

Обязательно всегда возвращайте копию клона поля и никогда не возвращайте экземпляр реального объекта.

В: Преимущества непреложного classа?

Поточно-

Справка: Как создать неизменяемый class в java

Как не говорящий по-английски оратор, мне не нравится обычная интерпретация «неизменяемого classа», поскольку «построенные объекты classа неизменны»; скорее, я сам склоняюсь к тому, чтобы интерпретировать это как «сам объект classа неизменен».

Тем не менее, «неизменный class» – это своего рода непреложный объект. Разница заключается в том, чтобы ответить на вопрос о том, какая польза. По моему знанию / интерпретации, неизменяемый class не позволяет своим объектам изменять поведение во время выполнения.

  • Алгоритм поиска нескольких совпадений строк
  • Что рекурсивно распространяется на все файлы в текущем каталоге?
  • Как обрезать пробелы?
  • Конкатенация строк: оператор concat () vs "+"
  • Строка неизменна. В чем же смысл?
  • Разделить строку на слова несколькими разделителями
  • Выделить выбранную строку ListView
  • Как форматировать строки в Java
  • Как разбить одну строку на несколько строк, разделенных хотя бы одним пространством в оболочке bash?
  • Как избежать% в String.Format?
  • Как строки передаются в .NET?
  • Давайте будем гением компьютера.