Veo los POJO más inmutables escritos de esta forma:
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;
}
}
Sin embargo, tiendo a escribirlos así:
public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
Tenga en cuenta que las referencias son finales, por lo que el objeto sigue siendo inmutable. Me permite escribir menos código y permite un acceso más corto (por 5 caracteres: get
y ()
).
La única desventaja que puedo ver es que si quieres cambiar la implementación de getFoo()
en el futuro para hacer algo loco, no puedes. Pero de manera realista, esto nunca sucede porque el Objeto es inmutable; puede verificar durante la creación de instancias, crear copias defensivas inmutables durante la ejemplificación (consulte el ejemplo de ImmutableList
de Guava) y obtener los objetos foo
o bar
listos para la llamada get
.
¿Hay alguna desventaja que me esté perdiendo?
EDIT
Supongo que otra desventaja que me falta es que las bibliotecas de serialización utilizan la reflexión sobre los métodos que comienzan con get
o is
, pero esa es una práctica bastante terrible ...