Sobes.tech
Junior

Πώς διασφαλίζεται η αμεταβλητότητα στη Java;

sobes.tech AI

Απάντηση από AI

Η αμεταβλητότητα στην Java διασφαλίζεται με τους ακόλουθους τρόπους:

  1. Ορισμός της κλάσης ως final: Η κλάση δεν μπορεί να κληρονομηθεί, αποτρέποντας τη δημιουργία μεταβλητών υποκλάσεων.

  2. Ορισμός όλων των πεδίων ως final: Η τιμή του πεδίου μπορεί να ανατεθεί μόνο μία φορά (κατά την αρχικοποίηση ή στον κατασκευαστή) και δεν μπορεί να αλλάξει μετά τη δημιουργία του αντικειμένου.

  3. Ιδιωτικότητα των πεδίων: Τα πεδία πρέπει να είναι ιδιωτικά (private) για να αποτρέπεται η άμεση πρόσβαση και η τροποποίησή τους από έξω από την κλάση.

  4. Απουσία setters ή μεθόδων που αλλάζουν την κατάσταση του αντικειμένου: Η κλάση δεν πρέπει να παρέχει δημόσιες μεθόδους που μπορούν να αλλάξουν τις τιμές των πεδίων μετά τη δημιουργία.

  5. Ορθή διαχείριση των μεταβλητών πεδίων: Αν η κλάση περιέχει αναφορές σε μεταβλητά αντικείμενα (π.χ., List ή μια δική της μεταβλητή κλάση), είναι απαραίτητο:

    • Να δημιουργούνται αντίγραφα αυτών κατά την αρχικοποίηση (στον κατασκευαστή).
    • Να επιστρέφονται αντίγραφα σε getters για να αποφεύγεται η αλλαγή της εσωτερικής κατάστασης του αντικειμένου από έξω.
public final class ImmutableExample { // τελική κλάση

    private final String name; // τελικό και ιδιωτικό πεδίο

    private final List<String> items; // τελικό και ιδιωτικό πεδίο

    public ImmutableExample(String name, List<String> items) {
        this.name = name;
        // Δημιουργία προστατευτικού αντιγράφου της μεταβλητής λίστας
        this.items = new ArrayList<>(items);
    }

    public String getName() {
        return name;
    }

    public List<String> getItems() {
        // Επιστροφή προστατευτικού αντιγράφου της μεταβλητής λίστας
        return Collections.unmodifiableList(new ArrayList<>(items));
    }

    // Απουσία setters ή μεθόδων που αλλάζουν την κατάσταση
}

Παραδείγματα ενσωματωμένων αμετάβλητων κλάσεων στην Java: String, κλάσεις-περιτυλίγματα των πρωταρχικών τύπων (Integer, Long, κ.λπ.), BigInteger, BigDecimal.