Si tratta di un'implementazione corretta di una classe Immutable in Java?

5
public final class ImmutableClass {

    private StringBuffer name;

    public ImmutableClass(StringBuffer name) {
        this.name=name;
    }
    public StringBuffer getName() {
        return name;
    }
}

Punti che ho considerato:

  1. Rendi la classe final in modo che non possa essere estesa
  2. Non fornire metodi di% mutatore public
  3. Mantieni le variabili di istanza private

Le considerazioni sopra menzionate sono sufficienti?

    
posta Nishant 06.12.2013 - 05:22
fonte

2 risposte

10

Si consideri:

ImmutableClass a = new ImmutableClass(new StringBuffer("hello"));
a.getName().append(" world");
System.out.println(a.getName()); // prints "hello world"

Quanto sopra consente al chiamante di mutare il valore di name . Oppure:

StringBuffer b = new StringBuffer("hello");
ImmutableClass a = new ImmutableClass(b);
System.out.println(a.getName()); // prints "hello"
b.append(" world");
System.out.println(a.getName()); // prints "hello world"

Quanto sopra è simile e mostra che una modifica a qualcos'altro può influire sul valore apparente di a .

Con la capacità di fare quanto sopra, la tua classe non può essere considerata "immutabile" da nessuna definizione. Tuttavia, se dovessi sostituire StringBuffer con String , la tua classe sarebbe immutabile (perché in Java, String è immutabile).

    
risposta data 06.12.2013 - 05:42
fonte
1

Se la classe è immutabile o meno dipende dal fatto che tu intenda o meno incapsulare identità di StringBuffer o contenuti di essa. Il design della classe suggerisce che incapsula l'identità di StringBuffer ; poiché non identificherà mai StringBuffer all'infuori dell'istanza individuata nell'istanza, la classe ImmutableClass può essere considerata immutabile. Tuttavia, le istanze di ImmutableClass che incapsulano un particolare StringBuffer non dovrebbero essere esposte a nessun codice che non può essere considerato attendibile con un riferimento non protetto a quel StringBuffer .

Lo schema di avere una classe immutabile identifica un oggetto mutevole non è molto comune, ma ci sono alcuni casi in cui potrebbe essere appropriato. Forse l'esempio più naturale sarebbe una classe il cui scopo è quello di impostare un oggetto mutabile su un particolare stato; tale classe incapsulerebbe un riferimento all'oggetto in questione insieme allo stato desiderato. Se l'identità dell'oggetto e lo stato a cui deve essere impostato sono entrambi immutabili, la classe che incapsula quelle cose sarebbe allo stesso modo immutabile. Un aspetto chiave di tali progetti è che la classe che incapsula l'identità dell'oggetto mutevole non si preoccupa del fatto che lo stato di quell'oggetto sia parte del suo stato. Questa situazione è molto diversa da un tipo che contiene un riferimento a un oggetto mutabile non condiviso allo scopo di incapsulare il proprio stato in esso . Un oggetto che incapsula lo stato mutabile ovunque, sia esso stesso o in un altro oggetto, è mutabile. Tenere semplicemente un riferimento a un oggetto mutevole, tuttavia, non implica lo stato di incapsulamento dello stesso.

    
risposta data 21.12.2013 - 09:23
fonte

Leggi altre domande sui tag