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]