Как сделать класс иммутабельным в java?

Пользователь

от clement.erdman , в категории: Java , 3 года назад

Как сделать класс иммутабельным в java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jerrold_langworth , 2 года назад

@clement.erdman 

Чтобы сделать класс иммутабельным в Java, нужно сделать следующее:

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


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public final class ImmutableClass {
    private final int field1;
    private final String field2;

    public ImmutableClass(int field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public int getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }
}


В этом примере класс ImmutableClass является иммутабельным, так как не содержит никаких методов, которые могут изменять его состояние, и все его поля являются финальными. Значения п

Пользователь

от violette_robel , 2 года назад

@clement.erdman 

Чтобы сделать класс неизменяемым (immutable) в Java, нужно выполнить несколько условий:

  1. Сделать все поля класса приватными (private) и финальными (final), чтобы они не могли быть изменены.
  2. Не предоставлять сеттеры (setter methods) для полей класса.
  3. Если класс содержит ссылочные типы данных, необходимо гарантировать, что они тоже не могут быть изменены. Это можно сделать, например, путем создания копии объекта при передаче его в конструктор класса.
  4. Объявить класс как final, чтобы его нельзя было наследовать и изменять.
  5. Предоставить методы доступа (getter methods) для чтения полей класса.
  6. Если класс содержит изменяемые поля, необходимо гарантировать, что изменения этих полей не будут влиять на состояние объекта. Например, можно использовать копии этих полей при создании объекта.


Пример кода неизменяемого класса:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public final class ImmutableClass {
    private final int field1;
    private final String field2;

    public ImmutableClass(int field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public int getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }
}


Здесь поля класса field1 и field2 объявлены как private final, конструктор класса устанавливает их значения, а методы getField1() и getField2() предоставляют доступ для их чтения. Класс также объявлен как final, что гарантирует, что он не может быть наследован и изменен.