Sobes.tech
Middle

Javaда класс кандайча өзгөрбөс кылуу керек?

sobes.tech AI

AIден жооп

Javaда immutable (өзгөртпөстүү) класс түзүү үчүн, төмөнкү принциптерди сактоо керек:

  1. Классты final деп белгилөө. Бул мурас алуу алдын алат, ал өзгөртүү абалын алып келиши мүмкүн.
  2. Бардык талааларды private кылуу. Бул сырттан түздөн-түз жетүүнү чектейт.
  3. Өзгөртүүчү (сеттер) методдорду бербөө.
  4. Бардык өзгөрүлмө талааларды final кылуу. Бул өзгөрүлмө объекттердин шилтемелери өзгөрбөйт деп кепилдик берет.
  5. Эгер класс өзгөрүлмө объекттерге шилтемелерди камтыса (мисалы, java.util.Date, коллекциялар), анда геттерлерден кайтарганда же конструкторго берүүдө, ошол объекттердин көчүрмөлөрүн түзүп, кайтаруу керек. Бул "терең көчүрүү" деп аталат.

Мисал:

// Өзгөртпөстүү класс мисалы
final class ImmutablePerson {
    private final String name;
    private final int age;
    private final List<String> hobbies; // Өзгөрүлмө талаа

    // Терең көчүрүү менен конструктор
    public ImmutablePerson(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        // `hobbies` тизмесинин көчүрмөсүн түзөбүз
        this.hobbies = new ArrayList<>(hobbies);
    }

    // Геттерлер
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // `hobbies` тизмесинин көчүрмөсүн кайтаруу, сырттан өзгөртүүнү алдын алуу үчүн
    public List<String> getHobbies() {
        return Collections.unmodifiableList(new ArrayList<>(this.hobbies));
    }

    // toString ыкмасын ыңгайлаштыруу
    @Override
    public String toString() {
        return "ImmutablePerson{" +
               "name='" + name + '\'' +
               ", age=" + age +
               ", hobbies=" + hobbies +
               '}';
    }
}

Колдонуунун мисалы:

// Өзгөртпөстүү классты колдонуу мисалы
List<String> initialHobbies = new ArrayList<>();
initialHobbies.add("Reading");
initialHobbies.add("Hiking");

ImmutablePerson person = new ImmutablePerson("Alice", 30, initialHobbies);

// Алынган тизмени өзгөртүүгө аракет кылуу исключение чыгарат
List<String> retrievedHobbies = person.getHobbies();
// retrievedHobbies.add("Coding"); // UnsupportedOperationException чыгат

// Баштапкы тизмени өзгөртүү ImmutablePerson объектине таасир этпейт
initialHobbies.add("Painting");

System.out.println(person); // Чыгуу: ImmutablePerson{name='Alice', age=30, hobbies=[Reading, Hiking]}
System.out.println(initialHobbies); // Чыгуу: [Reading, Hiking, Painting]