他の島。 Java用Lombokプロジェクト

この記事は、無料の翻訳再販の一種です。



どういうわけか、JavaがJava開発に関連する唯一の島ではないことがわかりました。 これはLombokと呼ばれる別のものです。 MITライセンスの下で配布される素晴らしいプロジェクトは、この島にちなんで名付けられました。



Project Lombokとは何ですか?



Project Lombokは、コンパイル段階のコードジェネレーターと開発段階のコードジェネレーターの2つの要素を備えています。 これは、検索を素晴らしいものにします。

本質的に、LombokはEclipseのコンパイルサイクルに直接統合され( 入力の過程でコード構文の抽象ツリーを操作することにより )、注釈に基づいてコードを即座に生成します。 生成されたコードは、他のすべてのクラスですぐに使用可能になります。

Lombokは注釈からどのコードを生成できますか? 最も重要なことは、基本的なテンプレートが生成され、通常、Javaクラスが非常に冗長で怪しいように見えることです。



同時に、Lombokは自動リソース管理を提供します。 たとえば、try / catch / finallyブロックを使用する必要なく、スレッドは常に安全に閉じられます。



LombokのインストールとMavenのサポート



LombokはJAR実行可能ファイル( lombok.jar )として提供されます。 確かに、現在、開発環境モードはEclipseでのみ機能します。 JARファイルを実行すると、シンプルなウィザードが表示され、Eclipse実行可能ファイルの場所を指定するよう求められます(図1を参照)。







図1. Lombokインストールウィザード。



Eclipse実行可能ファイルをポイントし、「インストール/更新」をクリックします。 Lombokのすべての新しいバージョンでは、これを毎回行う必要があります。

Mavenサポートを有効にするには、プロジェクトWebサイトの指示に従って、Lombokリポジトリとその依存関係をpom.xmlファイルに追加するだけです。 その後、LombokはMavenコンパイルライフサイクルを「そのまま」使用します。



動作中のプロジェクトLombok



Lombokが典型的なPOJOクラスの多くのコード行を終了する方法を完全に理解するには、次の典型的なPersonエンティティを考慮してください。

public class Person { private Long personId; private String salutation; private String firstName; private String middleName; private String lastName; private String phoneNumber; private String email; private String addressLine1; private String addressLine2; private String city; private String state; private String country; private Calendar birthDate; }
      
      







このクラスを実際の正しいPOJOにするには、コードのゲッター、セッター、toString()、equals()、hashCode()を追加する必要があります。 Eclipseで自動コード生成機能を使用することにした場合、Person POJOはキノコの速度で240行を超えるコードに成長します。そのほとんどは必要ではありますが、実際は単なるゴミであり、読みやすく理解するのが難しくなります。 (リスト1を参照)。



リスト1.自動生成されたPerson POJO


 public class Person { private Long personId; private String salutation; private String firstName; private String middleName; private String lastName; private String phoneNumber; private String email; private String addressLine1; private String addressLine2; private String city; private String state; private String country; private Calendar birthDate; public Long getPersonId() { return personId; } public void setPersonId(Long personId) { this.personId = personId; } public String getSalutation() { return salutation; } public void setSalutation(String salutation) { this.salutation = salutation; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddressLine1() { return addressLine1; } public void setAddressLine1(String addressLine1) { this.addressLine1 = addressLine1; } public String getAddressLine2() { return addressLine2; } public void setAddressLine2(String addressLine2) { this.addressLine2 = addressLine2; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public Calendar getBirthDate() { return birthDate; } public void setBirthDate(Calendar birthDate) { this.birthDate = birthDate; } @Override public String toString() { return "Person [addressLine1=" + addressLine1 + ", addressLine2=" + addressLine2 + ", birthDate=" + birthDate + ", city=" + city + ", country=" + country + ", email=" + email + ", firstName=" + firstName + ", lastName=" + lastName + ", middleName=" + middleName + ", personId=" + personId + ", phoneNumber=" + phoneNumber + ", salutation=" + salutation + ", state=" + state + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((addressLine1 == null) ? 0 : addressLine1.hashCode()); result = prime * result + ((addressLine2 == null) ? 0 : addressLine2.hashCode()); result = prime * result + ((birthDate == null) ? 0 : birthDate.hashCode()); result = prime * result + ((city == null) ? 0 : city.hashCode()); result = prime * result + ((country == null) ? 0 : country.hashCode()); result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); result = prime * result + ((middleName == null) ? 0 : middleName.hashCode()); result = prime * result + ((personId == null) ? 0 : personId.hashCode()); result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode()); result = prime * result + ((salutation == null) ? 0 : salutation.hashCode()); result = prime * result + ((state == null) ? 0 : state.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 (addressLine1 == null) { if (other.addressLine1 != null) return false; } else if (!addressLine1.equals(other.addressLine1)) return false; if (addressLine2 == null) { if (other.addressLine2 != null) return false; } else if (!addressLine2.equals(other.addressLine2)) return false; if (birthDate == null) { if (other.birthDate != null) return false; } else if (!birthDate.equals(other.birthDate)) return false; if (city == null) { if (other.city != null) return false; } else if (!city.equals(other.city)) return false; if (country == null) { if (other.country != null) return false; } else if (!country.equals(other.country)) return false; if (email == null) { if (other.email != null) return false; } else if (!email.equals(other.email)) 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; if (middleName == null) { if (other.middleName != null) return false; } else if (!middleName.equals(other.middleName)) return false; if (personId == null) { if (other.personId != null) return false; } else if (!personId.equals(other.personId)) return false; if (phoneNumber == null) { if (other.phoneNumber != null) return false; } else if (!phoneNumber.equals(other.phoneNumber)) return false; if (salutation == null) { if (other.salutation != null) return false; } else if (!salutation.equals(other.salutation)) return false; if (state == null) { if (other.state != null) return false; } else if (!state.equals(other.state)) return false; return true; } }
      
      







そして今、ロンボク化後の同じPOJOは次のようになります。

 @Data public class Person { private Long personId; private String salutation; private String firstName; private String middleName; private String lastName; private String phoneNumber; private String email; private String addressLine1; private String addressLine2; private String city; private String state; private String country; private Calendar birthDate; }
      
      







それだけです! EclipseランタイムにLombokがインストールされると、単純なデータアノテーションにより、必要な標準ガベージのすべてのコードが魔法のように描画されます。 これにより、JPA / Hibernateエンティティの定義が非常に簡単かつ高速になります。

しかし、それだけではありません! すべてのゲッターメソッドとセッターメソッドは、コードが実際に存在するかのように図に表示されます(図2を参照)。







図2.すべてのgetterおよびsetterメソッドが図に表示されています。



これらは、コードを完了するときにも見ることができます(図3を参照)。







図3.コードを追加すると、すべてのメソッドが表示されます



さらに細かなコントロールが必要な場合は、Project Lombokが以下の注釈Getter 、@Setter、@ToString、および@EqualsAndHashCodeを提供します。 また、上記のことは、 Data注釈を組み合わせると、それら自体がすべて囲まれることを意味します。 開発プロセスでは、99%のケースでデータ注釈が使用されています。



ロンボクの追加機能



先ほど見た基本的な機能に加えて、Lombokにはいくつかのアドオンが付属しています。





今後の計画:新しいJava機能の追加



執筆時点では、Lombokプロジェクトの現在のバージョンは0.8.5でした。 Lombokチームの短期的な見通しは、Eclipseの安定化と稼働時間でした。 以前のバージョンにはいくつかの小さな問題(たとえば、コンパイル中の予期しない警告)がありますが、プロジェクトを簡単に再コンパイルすると、それらをすぐに取り除くことができます。 全体として、Lombokを使用する利点は、既存の小さなEclipseグリッチよりはるかに重要です(私の経験では非常にまれです)。 ロンボクの長期計画はもっと野心的です。 Lombokプロジェクトの作成者(Reinier ZwitserlootとRoel Spilker)は両方とも、Eclipseでのコンパイルプロセスをインターセプトして、Javaの新機能、特に実際の完了を実際に追加できるようにします。 この野心的な目標の詳細については、 このGoogleグループのディスカッションをご覧ください。



短所



Lombokの主な欠点は明らかです。開発環境モードでの作業はEclipseでのみサポートされています。 EclipseがIDEでない場合、現時点ではLombokプロジェクトは選択できません。 おそらくそのようなサポートは、NetBeansおよびIntelliJ環境で将来登場する可能性がありますが、特定の環境に対してかなり重いIDEハックをいくつか提供します。 代わりに、Eclipseを使用するすべてのワークショップは、Lombokを毎日のツールキットに今日追加することを検討する必要があります。



さようなら冗長POJO



Lombokプロジェクトの導入により、ReinerとRoelはJava POJOの冗長性をレガシーにしました。 Lombokを毎日の開発プラクティスに追加するとき、戻りたくないだけです。 これは非常に単純であり、私たちの意見では、Eclipseが誕生した後、Javaエコシステムに最も革命的な追加されたものです。



参照資料










All Articles