/ / La classe finale è immutabile? - java, immutabilità

Tutte le classi finali sono immutabili? - java, immutabilità

Tutte le classi finali in Java sono immutabili. Sia String che Integer sono classi finali ed entrambi sono immutabili.

risposte:

22 per risposta № 1

No: una classe finale significa che non puoi ereditarla. Non ha nulla a che fare con la mutabilità. La seguente classe è definitiva e mutabile:

public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}

30 per risposta № 2

No, finale significa che la classe non può essere estesa. Non dice nulla sulla mutabilità. Per esempio:

final class MutInt {
public int modifyMe;
}

9 per risposta № 3

Non c'è una parola chiave per immutabilità, è più simile a un modello di progettazione.

MODIFICARE:
Ciò significa che non esiste una parola chiave che renda immutabile una classe. Per rendere una classe immutabile, devi proteggere gli interni rendendoli definitivi o privati.

La cosa confusa è questa: La parola chiave finale ha significati diversi se usata su una classe che ha quando viene usata su un campo / variabile. Il primo significa "questa classe non può essere estesa". Il secondo significa "questa variabile (o riferimento) non può essere cambiata".


5 per risposta № 4

Oltre alle altre risposte, se si guarda il codice per java.lang.String vedrai che contiene un campo: hash, che è mutevole ed è infatti calcolato e memorizzato quando hashCode() è chiamato per la prima volta.

Tuttavia, la classe è ancora immutabile: Il hash il campo non è accessibile direttamente o modificato al di fuori della classe.

Inoltre, è possibile notare che un approccio comune all'interno di JDK è l'implementazione di wrapper immutabili che possono essere utilizzati per esporre lo stato interno di un oggetto senza consentirne la modifica;

private final List<String> values;

public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}

5 per risposta № 5

Come è stato detto dagli altri prima final non rende una classe imuutabile in Java anche se gioca un ruolo nella strategia di immutabilità. Per ottenere l'immutabilità devi seguire le linee guida generali:

  • assicurati che la classe non possa essere ignorata: rendi la classe finaloppure utilizzare le fabbriche statiche e mantenere privati ​​i costruttori
  • creare campi private e final
  • costringere i chiamanti a costruire un oggetto completamente in un unico passaggio, invece di utilizzare un costruttore senza argomenti combinato con chiamate successive a setXXX metodi (cioè, evitare la convenzione Java Beans)
  • non fornire alcun metodo che possa modificare lo stato dell'oggetto in alcun modo, non solo setXXX metodi, ma qualsiasi metodo che può cambiare stato
  • se la classe ha campi oggetto mutabili, allora devono essere copiati in modo difensivo quando vengono passati tra la classe e il suo chiamante

2 per risposta № 6

Non è possibile accedere al campo privato tramite subi metodi sovrascritti di una classe ... Quindi non c'è modo in cui i metodi della sottocategoria cambino il campo privato della super classe ... Allora a che serve rendere definitiva la classe immutabile?


0 per risposta № 7

Le parole chiave definitive impediscono alle altre classi diereditarlo La parola chiave finale non lo rende immutabile, ma ci sono condizioni tali che rendono i membri della classe di istanza privati ​​e finali e utilizzando getter e non usando setter