Ответ 1
Я боюсь, нет альтернативы, если вы не захотите переключиться на нечто вроде Scala или довольны меньшим набором функции, подобные тем, которые предоставляются AutoValue.
Хотя AutoValue
, вероятно, лучше всего подходит для чистой Java, он предлагает
- @Getter
- @AllArgsConstructor
- @EqualsAndHashCode
- @ToString
- @Builder
но он пропускает
- @Wither
- toBuilder
- @Setter
- @Delegate
- @ExtensionMethod
- и некоторые другие функции, которые я не использую.
Хотя я твердо согласен с тем, что неизменность является добродетелью, иногда она неприменима. Во всяком случае, Ломбок старается поддерживать неизменность, даже интегрируется с гуавы неизменных коллекции, и вы можете написать
@Builder @Getter public final class Sentence {
private final boolean truthValue;
@Singular private final ImmutableList<String> words;
}
и используйте его как
Sentence s = Sentence.builder().truthValue(true)
.word("Lombok").word("is").word("cool").build();
assertEquals(3, s.getWords().size());
Примечание. Я не автор, поэтому могу сказать, что это круто.
Для неизменяемых, @Wither
и toBuilder
довольно круто. Первый позволяет создать копию, отличающуюся одним полем, а вторая дает вам строитель, начинающийся с текущих значений и подходящий для изменения нескольких полей. Следующие две строки эквивалентны:
o.withA(1).withB(2)
o.toBuilder().a(1).b(2).build()
Оба Ломбока и AutoValue
используют магию. Магия последнего - стандартная обработка аннотаций, поэтому она довольно надежная. Он имеет некоторые недостатки, перечисленные на стр. 27. Я бы добавил, что некоторые AutoValue_foo генерируются, которые я не заказывал.
Ломбок использует черную магию и, следовательно, гораздо более хрупкий, но он предлагает больше и работает очень хорошо.