web-dev-qa-db-ja.com

getter / setters / toString / constructorsのない明確なコードのLombok代替

ロンボクの代替品を知っていますか? Lombokを使用すると、ゲッターとセッターとtoStringでクラスをいじることを忘れることができます。自分のプロジェクトで使用したいのですが、もっと良い代替案があるのでしょうか。

Java= 1.7を使用しており、1.8に変更できません。

31
user1308908

恐れ入りますが、 Scala のようなものに切り替えたい場合、または AutoValue によって提供されるような機能の小さなセットに満足しない限り、代替手段はありません。

AutoValueはおそらくピュアJavaで実現できる最高のものですが、

  • @Getter
  • @AllArgsConstructor
  • @EqualsAndHashCode
  • @ToString
  • @ビルダー

しかし、それは逃します

  • @Wither
  • toBuilder
  • @セッター
  • @デリゲート
  • @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());

注:私は著者ではないので、かっこいいと言えます。

不変の場合、@WithertoBuilderはかなりクールです。前者は単一のフィールドが異なるコピーを作成することを可能にし、後者は現在の値から始めて複数のフィールドを変更するのに適したビルダーを提供します。次の2行は同等です。

o.withA(1).withB(2)
o.toBuilder().a(1).b(2).build()

LombokとAutoValueはどちらも魔法を使います。後者の魔法は標準の注釈処理なので、非常に堅牢です。 27ページ にリストされているように、いくつかの欠点があります。注文しなかったAutoValue_fooが生成されるという事実を追加します。

ロンボクはいくつかの黒魔術を使用しているため、はるかに壊れやすくなっていますが、より多くのものを提供し、かなりうまく機能します。

24
maaartinus

「より良い」はここではかなり論争ですが、1つの代替案は AutoValue であり、利用可能です hereこのプレゼンテーション は、AutoValueとの違いのいくつかを説明しています。ロンボク。

特に、AutoValueは不変性(一般的に良いことです!)と最小限の言語外の魔法(Lombokとは非常に異なります)を強調しています。

11
Louis Wasserman