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]