ProjectLombokとの共通のJavaオブジェクト機能

Project Lombokは、Javaクラス用に一般的に記述されている定型的なJavaコードの量を減らすために使用できる小さなライブラリです。Project Lombokは、一般的なメソッドが必要なJavaクラスに追加できるアノテーションを介してこれを行います。ほとんどのアノテーションは、名前がわかりやすいものです。@ Getter、@ Setter、@ EqualsAndHashCode、@ ToString、および@NoArgsConstructorが例です。この投稿では、単純なLombokアノテーションを適用して、これらの一般的に記述されたメソッドをJavaクラスに追加する方法を示します。

これは、toString()の事前定義されたオーバーライドバージョンがない単純なクラスです。

toString-less Person.java

package dustin.examples; /** * Simple Person class without boilerplate. * * @author Dustin */ public class Person { private String lastName; private String firstName; } 

上記のクラスが生成され、その暗黙的に継承された(Objectから)toString()メソッドが呼び出されると、出力は次の画像に示すようになります。

明示的なtoString()メソッドを作成するか、ProjectLombokを使用できます。次のコードスニペットは、ProjectLombokのアプローチを示しています。

Lombokの@ToStringアノテーションを使用したPerson.java

package dustin.examples; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString public class Person { private String lastName; private String firstName; } 

次に、Lombokが提供するtoString()を使用してこのクラスのコンテンツを出力した結果を示します。

Personオブジェクトのより良いtoString()表現がありますが、そのフィールドはまだ初期化されていないため、null値しか表示されません。Lombokを再度使用してコンストラクターを作成できます。

Lombokの@AllArgsConstructorアノテーションを使用したPerson.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor public class Person { private String lastName; private String firstName; } 

これで、Personオブジェクトのインスタンス化時にパラメーターを渡すことができます(実際には必須です)。結果を次の画面画像に示します。この場合、NetBeansは2つの文字列を受け入れるPersonにコンストラクタがあるとは考えていないため、クライアントコード(Main.java)はNetBeansでコンパイル時エラーを示しています。赤い波線のマークにもかかわらず、NetBeansにビルドを依頼すると、コードはビルドされます。

Person.javaのようなクラスは、多くの場合、比較や、場合によってはhashCodeベースのコレクションキーで使用する必要があるデータクラスです。equals(Object)とhashCode()の実装を正しく作成し、それらが一緒に作成されていることを確認することが重要です。親Objectクラスによって提供されるデフォルトのequalsメソッドとhashCodeメソッドがあるため、Personインスタンスを使用するJavaコードは、equalsやhashCodeを実行できますが、実際に必要なものではない可能性があります。Main実行可能クラスが次のコードリストに変更されると、その後の出力が表示され、コンテンツではなくIDに基づいて同等性の比較が完全に行われていることがわかります。

equals()の実装をテストするMain.java

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } } } 

これは、ここで求められることではほとんどありません。代わりに、明示的なequalsの実装が必要です。このためのLombokアノテーション@EqualsAndHashCodeは、これらを個別に明示的にオーバーライドする意味がないため、これらの両方を一緒に生成するだけであるという事実が気に入っています。次に、Person.javaクラスのリストに、@ EqualsAndHashCodeアノテーションを追加して示します。

@EqualsAndHashCodeを使用したPerson.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { private String lastName; private String firstName; } 

出力が良くなりました。

必要に応じて、各パブリックフィールドに個別にアクセスする良い方法はまだありません。たとえば、姓に基づいてコードで何かを実行したい場合、抜本的な手順を実行せずにそれを実現する良い方法はありません。ここで再びロンボクを使用できます。

この例では、人の姓だけが変更される可能性があるという誤った仮定をしたと仮定します。この仮定のため、姓にはLombok @Setterアノテーションのみを提供しますが、両方のフィールドには@Getterアノテーションを提供します。変更された個人コードを次に示します。

@Getterおよび@Setterを使用したPerson.java

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { @Getter @Setter private String lastName; @Getter private String firstName; } 

この例を実行するために更新されたMainクラスは次のとおりです。

新しいセッター/ゲッターを利用するMain.java

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } final Person accessiblePerson = new Person("Garzminski", "Gary"); out.println("The last name is " + accessiblePerson.getLastName()); out.println("The first name is " + accessiblePerson.getFirstName()); //accessiblePerson.setFirstName("Grady"); accessiblePerson.setLastName("Garfunkel"); out.println("The new last name is " + accessiblePerson.getLastName()); } } 

コードがビルドされるように、Personの名を設定するための呼び出しをコメントアウトする必要がありました。これで、次の画面スナップショットに示すように実行されます。

このLombokアノテーションのコレクションは、特にデータ指向のクラスで一般的に望まれる可能性があります。このため、Project Lombokは、これらのアノテーションのコレクションを提供する@Dataなどの集約されたアノテーションを提供します。この場合、@ Dataを使用して提供したいくつかの個別のアノテーションと非常によく似た動作を得ることができます。@Dataアノテーションにより、Lombokは@Getterをすべてのフィールドに適用し、@ Setterをすべての非最終フィールドに適用します。私が使用したものとのもう1つの大きな違いは、@ AllArgsConstructorではなく@RequiredArgsConstructorを使用することです。

Project Lombokがコンパイルされた.classファイルに対して何をしたかを確認する最良の方法の1つは、javapを使用することです。これは、次の画面のスナップショットに示されています。

この出力では、ボイラープレートコードで一般的に見られる一連のメソッドがコンパイルされたPerson.classで利用可能であることがわかります。2つの引数のパラメーター化されたコンストラクター、hashCode()、equals(Object)、toString()、および予想されるgetメソッドとsetメソッドがあります。

プロジェクトロンボクには懸念と制限があります。これらの多くは、HamletD'Arcyの投稿JavaWithout the Boilerplate-ProjectLombokへの応答で明確に表現されています。1つの制限は、Eclipse以外のIDEでのサポートの減少です(ただし、適切なNetBeansサポートがあり、javacがサポートされています)。懸念されるのは、コードを使用および保守している他の人がLombokに新たに依存する必要があることです。この懸念は、必要に応じてビルドプロセスで使用できるデロンボックを使用することである程度軽減できます。

Project Lombokをカバーする他の記事やブログ投稿には、Project Lombok-Never Write Java Boilerplate Code Again、Java Without the Boilerplate-Project Lombok、Project Lombok:Bye Bye Boilerplate、JavaPosseのProjectLombokインタビュー、Project Lombok:JavaVerbosityに終止符を打つ、Project Lombok-Java Toolkitになくてはならないもの、Project Lombok:注釈プロセッサを使用した興味深いBeanショートカット、インタビュー:LombokでのReinierとRoel、Project Lombokを使用したボイラープレートコードの削減、Lombokを使用した迅速な開発、Lombokはボイラープレートコードを削減、ゲッターとセッターのためのより良い代替手段。

このストーリー「ProjectLombokとの共通のJavaオブジェクト機能」は、もともとJavaWorldによって公開されました。