Javaプロジェクトロンボク
プロジェクトロムボクは、Javaプロジェクトで冗長なコードを減らすための非常に便利なツールです。
問題の述べ方
package com.askrakesh.java.manage_boilerplate;
import java.time.LocalDate;
public class Person {
String firstName;
String lastName;
LocalDate dateOfBirth;
public Person(String firstName, String lastName, LocalDate dateOfBirth) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.dateOfBirth = dateOfBirth;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dateOfBirth == null) ? 0 : dateOfBirth.hashCode());
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (dateOfBirth == null) {
if (other.dateOfBirth != null)
return false;
} else if (!dateOfBirth.equals(other.dateOfBirth))
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
@Override
public String toString() {
return "Person [firstName=" + firstName + ", lastName=" + lastName + "dateOfBirth=" + dateOfBirth + "]";
}
}
クラスは、インスタンス変数のためのゲッターセッター、equalsおよびhashCodeメソッドの実装、全てのフィールドのコンストラクター、およびtoStringメソッドの実装を持つべきです。このクラスは現時点ではビジネスロジックがなく、それでも80行以上のコードです。これは狂っています。
プロジェクト ロムボク
プロジェクトLombokは、エディタやビルドツールに自動的に組み込まれ、ボイラープレートのコードを削減するのを支援するJavaライブラリです。まず、Lombokプロジェクトのセットアップ方法を見てみましょう。
JavaプロジェクトLombokはどのように機能しますか?
ランボクには、コンパイル時に処理されるコード内で使用できるさまざまなアノテーションがあり、使用されたアノテーションに基づいて適切なコードの展開が行われます。ランボクは、ビュー時にのみコードの削減を行い、コンパイル後のバイトコードにはすべてのボイラープレートが注入されます。これにより、コードベースを小さく、クリーンで読みやすく、メンテナンスしやすく保つことができます。
プロジェクトLombokのMaven
プロジェクトにLombokを追加するのは簡単です。以下の依存関係をMavenプロジェクトのpom.xmlファイルに追加するだけです。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
IDE(Eclipse)にLombokプラグインを追加する
「Windowsのインストール手順を以下に示します:」
-
- https://projectlombok.org/download から jar ファイルをダウンロードするか、Maven ビルドでダウンロードした jar を使用します。
-
- ターミナルで以下のコマンドを実行してください: java -jar lombok.jar
- このコマンドは、下記の画像のようなウィンドウを表示します。インストーラを実行して終了し、Eclipse を再起動してください。
-
- 以下のように日本語で書き換えます(一つのオプションのみ):
lombok.jarをEclipse.app/Contents/MacOSディレクトリにコピーします。
Eclipse.app/Contents/Eclipse/eclipse.iniファイルの末尾に-javaagent:lombok.jarを追加します。
Eclipseを再起動し、プロジェクトのプロパティで「アノテーション処理」を有効化します。下の画像に示すように。
LombokのEclipseアウトラインでのプレビュー
LombokのJavaバイトコードにおけるpeek
プロジェクトロンボクのアノテーション
プロジェクトLombokは、さまざまなシナリオでボイラープレートのコードを減らすための多くのアノテーションを提供しています。以下にいくつかを紹介しましょう。
-
- コンストラクタアノテーション
-
- @AllArgsConstructor
-
- public class PersonLombok {
-
- @NonNull String firstName;
-
- String lastName;
-
- LocalDate dateOfBirth;
-
- public static void main(String[] args) {
-
- new PersonLombok(null, “Kumar”, LocalDate.now());
-
- }
-
- }
上記のコードは次のものをクラスに注入します:
@AllArgsConstructorによるすべての引数を持つコンストラクタ
Constructorに引数を渡すときに@NonNullによるnullチェック。@NonNullアノテーションは、引数をメソッドのパラメーターとして渡す場合にも使用できます。
以下はプログラムの実行結果です。@RequiredArgsConstructorは、特別な処理が必要な各フィールドごとに1つのパラメータを持つコンストラクタを生成します。初期化されていないすべての非終了フィールドにはパラメータが割り当てられ、また、非終了であるが初期化されていない@NonNullフィールドにもパラメータが割り当てられます。
Getter/Setter アノテーション
これらのアノテーションは、フィールドレベルまたはクラスレベルで使用することができます。細かい制御をしたい場合はフィールドレベルで使用します。クラスレベルで使用すると、すべての getter/setter が作成されます。前述のクラスで作業しましょう。
@AllArgsConstructor
@Getter
@Setter
public class PersonLombok {
String firstName;
String lastName;
LocalDate dateOfBirth;
}
equals、hashCode、toString アノテーション
クラスを作成する際には、hashCode() メソッドと equals() メソッドをオーバーライドすることが推奨されます。Lombokでは、@EqualsAndHashCode アノテーションを使用して、equals() メソッドと hashCode() メソッドのコードを注入することができます。さらに、@ToString アノテーションは、toString() の実装を提供します。以下を見てみましょう:
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
@ToString
public class PersonLombok {
String firstName;
String lastName;
LocalDate dateOfBirth;
}
以上のように、Lombokのアノテーションを使用して、ボイラープレートコードを使用せずにPersonクラスを作成することができました。しかし、さらに良くなります。上記のクラスで使用されるすべてのアノテーションを@Dataで置き換えて、同じ機能を得ることができます。
デザインパターンベースのアノテーション
@Builderを使用すると、ビルダーパターンを使用してクラスをインスタンス化するために必要なコードを自動生成できます。
@Builder
public class Employee {
String firstName;
String lastName;
LocalDate dateOfBirth;
public static void main(String[] args) {
Employee emp = new EmployeeBuilder().firstName(“Rakesh”)
.lastName(“Kumar”)
.dateOfBirth(LocalDate.now())
.build();
}
}
@Delegateは、使用されているフィールドに対して呼び出しを転送するデリゲートメソッドを生成します。 “継承よりもコンポジションをお勧めする” とは言え、これはアダプターパターンと似たボイラープレートコードを作成します。Lombokは、この機能を実装する際に Groovy の同じ名前のアノテーションからヒントを得ました。実装を見てみましょう:
@RequiredArgsConstructor
public class AdapterImpl implements Adapter {
@Delegate
private final Adaptee instance;
public static void main(String[] args) {
AdapterImpl impl = new AdapterImpl(new Adaptee());
impl.display();
}
}
interface Adapter {
public void display();
}
class Adaptee {
public void display() {
System.out.println(“In Adaptee.display()”);
}
}
Lombokは、すべてのアノテーションにおいて詳細な制御機能を提供しています。
ボイラープレート: Javaアーキテクトのみなさんは聞いていますか?
はい、そうです。他の言語とは異なり、Javaは古いバージョンのJavaで動作している既存のコードを壊さないように、言語のアップグレードに最大限の注意を払っています。これ自体が膨大な仕事であり、軽視することはできません。既に、言語にはより良い型推論の機能を変更し、開発しています。Java 10で計画されている重要な機能の一つは、ローカル変数の型推論です。この機能は、ボイラープレートコードの管理に関するものではなく、むしろ動的型付けを追加する役割が大きいですが、ボイラープレートコードを管理するための小さな進歩と言えるでしょう。
要約
ボイラープレートコードの削減は、より読みやすさを向上させ、コードの量が少ないほどエラーも少なくなります。プロジェクトLombokは、ほとんどの主要な組織で広く使用されています。私たちはあなたに最も有用なLombokの機能を提供しました。ぜひ試してみてください。ソースコード:このチュートリアルで使用された完全なソースコードをダウンロードするために、私のGithubリンクを訪問できます。