Πώς διασφαλίζεται η αμεταβλητότητα στη Java;
sobes.tech AI
Απάντηση από AI
Η αμεταβλητότητα στην Java διασφαλίζεται με τους ακόλουθους τρόπους:
-
Ορισμός της κλάσης ως
final: Η κλάση δεν μπορεί να κληρονομηθεί, αποτρέποντας τη δημιουργία μεταβλητών υποκλάσεων. -
Ορισμός όλων των πεδίων ως
final: Η τιμή του πεδίου μπορεί να ανατεθεί μόνο μία φορά (κατά την αρχικοποίηση ή στον κατασκευαστή) και δεν μπορεί να αλλάξει μετά τη δημιουργία του αντικειμένου. -
Ιδιωτικότητα των πεδίων: Τα πεδία πρέπει να είναι ιδιωτικά (
private) για να αποτρέπεται η άμεση πρόσβαση και η τροποποίησή τους από έξω από την κλάση. -
Απουσία setters ή μεθόδων που αλλάζουν την κατάσταση του αντικειμένου: Η κλάση δεν πρέπει να παρέχει δημόσιες μεθόδους που μπορούν να αλλάξουν τις τιμές των πεδίων μετά τη δημιουργία.
-
Ορθή διαχείριση των μεταβλητών πεδίων: Αν η κλάση περιέχει αναφορές σε μεταβλητά αντικείμενα (π.χ.,
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.