Sobes.tech
Middle

Ko nepieciešams darīt, lai izveidotu immutable klasi Java?

sobes.tech AI

Atbilde no AI

  • Deklarēt klasi ar final modifikatoru, lai novērstu mantošanu.
  • Deklarēt visas klases laukus ar final modifikatoru.
  • Deklarēt visus klases laukus kā private, lai novērstu tiešu piekļuvi.
  • Nepiedāvāt seterus laukiem.
  • Ja klase satur mutablas objektus (piemēram, ArrayList), tad:
    • Konstruktorā kopēt iebraukošos mutablos objektus vietā, lai aizstātu saites.
    • Getteros atgriezt mutablos objektu kopijas, nevis pašus objektus.

Piemērs:

// Person klase ir immutable
public final class Person {

    private final String name;
    private final int age;
    private final List<String> tags; // Mutabls lauks

    // Konstruktorā dziļi kopē mutablos laukus
    public Person(String name, int age, List<String> tags) {
        this.name = name;
        this.age = age;
        // Kopējam sarakstu, izveidojot jaunu objektu
        this.tags = new ArrayList<>(tags);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Atgriež kopiju saraksta, lai novērstu tā maiņu ārpus klases
    public List<String> getTags() {
        return new ArrayList<>(tags);
    }

    // Pārrakstīt `equals` un `hashCode` metodes, ja nepieciešams
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name) &&
               Objects.equals(tags, person.tags);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, tags);
    }
}