Я вижу большинство неизменных POJO, написанных так:
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;
}
}
Тем не менее, я склонен писать их так:
public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
Обратите внимание, что ссылки являются окончательными, поэтому объект по-прежнему неизменен. Это позволяет мне писать меньше кода и обеспечивает более короткий (на 5 символов: getи ()) доступ.
Единственный недостаток, который я вижу, - если вы хотите изменить реализацию getFoo()в будущем, чтобы сделать что-то сумасшедшее, вы не можете. Но на самом деле этого никогда не происходит, потому что Объект неизменен; Вы можете проверить во время создания экземпляра, создать неизменные защитные копии во время создания экземпляра (см., ImmutableListнапример, Guava ) и получить объекты fooили, barготовые к getвызову.
Есть ли недостатки, которые я пропускаю?
РЕДАКТИРОВАТЬ
Полагаю, еще один недостаток, который мне не хватает, - это библиотеки сериализации, использующие рефлексию над методами, начинающимися с getили is, но это довольно ужасная практика ...
String, intили MyObject. В первой версии finalтолько для того, чтобы гарантировать, что другие методы, кроме конструктора внутри класса, не пытаются bar = 7;, например. Во втором варианте, finalнеобходимо , чтобы предотвратить потребителей делать: MyObject x = new MyObject("hi", 5); x.bar = 7;.
Objectвсе еще неизменны». Вводит в заблуждение - таким образом, кажется, вы думаете, что что-то final Objectнеизменно, а это не так. Извините за недопонимание.
myObj.getFoo().setFrob(...).
finalне делает переменную неизменным объектом. Обычно я использую дизайн, в котором я определяюfinalполя перед созданием обратного вызова, чтобы обратный вызов мог получить доступ к этим полям. Конечно, он может вызывать все методы, включая любыеsetXметоды.