Middle
Javaда класс кандайча өзгөрбөс кылуу керек?
sobes.tech AI
AIден жооп
Javaда immutable (өзгөртпөстүү) класс түзүү үчүн, төмөнкү принциптерди сактоо керек:
- Классты
finalдеп белгилөө. Бул мурас алуу алдын алат, ал өзгөртүү абалын алып келиши мүмкүн. - Бардык талааларды
privateкылуу. Бул сырттан түздөн-түз жетүүнү чектейт. - Өзгөртүүчү (сеттер) методдорду бербөө.
- Бардык өзгөрүлмө талааларды
finalкылуу. Бул өзгөрүлмө объекттердин шилтемелери өзгөрбөйт деп кепилдик берет. - Эгер класс өзгөрүлмө объекттерге шилтемелерди камтыса (мисалы,
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]