Vedo i POJO immutabili scritti in questo modo:
public class MyObject {
private final String foo;
private final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
Eppure tendo a scriverle così:
public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
Nota che i riferimenti sono definitivi, quindi l'oggetto è ancora immutabile. Mi consente di scrivere meno codice e consente l'accesso più breve (di 5 caratteri: get
e ()
).
L'unico svantaggio che posso vedere è se vuoi cambiare l'implementazione di getFoo()
in fondo alla strada per fare qualcosa di pazzo, non puoi. Ma realisticamente, questo non accade mai perché l'Oggetto è immutabile; puoi verificare durante l'istanziazione, creare copie difensive immutabili durante l'istanziazione (vedi ad esempio% co_de di Guava), e ottenere gli oggetti ImmutableList
o foo
pronti per la chiamata di bar
.
Ci sono degli svantaggi che mi mancano?
Modifica
Suppongo che un altro svantaggio che mi manca sono le librerie di serializzazione che usano il reflection sui metodi che iniziano con get
o get
, ma questa è una pratica piuttosto terribile ...