ロンボクゲッター/セッターvs Java 14レコード


10

私はLombokプロジェクトが大好きですが、最近はJava 14の新機能のいくつかを読んで試しています。

新しい機能には、コンストラクター、プライベート最終フィールド、アクセサー、equals / hashCode、getters、toStringメソッドなどの機能がすでに組み込まれているクラスを作成できるようにするrecordキーワードがあります。

今私の質問です:ロンボクの機能に依存する方が良いですか、それともレコード機能を使い始めるべきですか:

これを使用する方が良いです:

record Person (String name, String surname) {}

またはその:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

両方のアプローチの長所と短所は何ですか?


1 recordつには、JavaBeansスタイルのゲッターとセッターを想定しているものでは機能しません。
Mark Rotteveel

2
Rotteveelのコメントが意味することは、レコードのプロパティアクセサーメソッドには、プロパティの同じ名前が付けられるということです。だから、alice.phoneNumber()むしろで接頭辞のJavaBeansの慣例よりgetのように、alice.getPhoneNumber()
バジルブルク

1
このrecord機能はプレビュー機能あり、まだ本番環境で使用する準備ができいません
バジルブルク

レコードは、レコードは、たとえば、他のレコードやクラスを拡張することはできません、このJEPの上の制限のセクションをチェック、クラスに比べて多くの制約があり openjdk.java.net/jeps/359をさらに詳細
NAIT

回答:


9

LombokとrecordJava言語の機能は、さまざまなことを行うためのさまざまなツールです。表面的な重複がありますが、気を散らさないでください。

ロンボクは主に構文上の利便性についてです。これは、いくつかの既知の有用なコードパターンがプリロードされたマクロプロセッサです。セマンティクスは付与されません。アノテーション付きのコードで設定したノブに従って、パターンを自動化するだけです。ロンボクは純粋にデータを運ぶクラスを実装することの便利さについてです。

レコードはセマンティック機能です。それらは名目タプルです。セマンティック宣言することによって、Point あるのタプルを(int x, int y)、コンパイラは、この状態の記述から、その表現だけでなく、建設、宣言、平等、ハッシュ、文字列表現プロトコルを導き出すことができます。リーダーとフレームワークはセマンティクスを持っているため、レコードのAPIについてより高い信頼性で推論することもできます。(これは構文的にも便利です。もしそうなら、それは素晴らしいことです。)


1
+1ブライアンゲッツ:そして、それはあなたがあなたのIDEに現在のロンボクのバージョンを入れることができると仮定しています。Lombokには、クラスのコメントが与えないコードの迅速な読み取りに関して、意味のある利点があるのでしょうか。
トランク

4

私はしばらくの間、この組み合わせをいじくり回しており、わずかな実践で、次の違いをリストアップすることができます。

ロンボク

  • レコードはまだリリースされた機能ではなく、単なるプレビュー機能です。したがって、ロンボク島に留まることの方が理にかなっています。
  • Lombokをすべて削除するためのツールとしてはまだ強力ではありません。ライブラリには、以外にも多くの機能があります@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
  • 自分で経験することは、レコードへの移行に関してEqualsAndHashCode予想されるものとは異なります

記録

  • 別の見方をすれば、オブジェクト表現の要件が「データキャリア」である場合でも、追加のライブラリに依存せずに定型コードを削減してレコードを活用できます。それが、決定的な注記として、このブログが以下を読む理由です。

    また、チームが基礎となるパターンの多くの手作業でコード化された実装を排除し、Lombokなどのライブラリーの必要性を削減または削除するのにも役立ちます。

もちろん、日常的には、プロジェクトの要件に基づいて、どの方法を実行するかを選択することは常に賢明です。


注-現在のところ、両方を頻繁に使用するユーザーになるためのより多くの例を使用して、これを更新し続けたいと思います。
ナマン

3

注意:注釈のクリスマスツリーの代わり@Valueに、クラスで使用することができます。これにより、クラスがfinalになり、すべてのフィールドが非公開と最終の両方になり、残りもすべて提供されることに注意してください。これは、レコードが何であるかに近いです(それらも最終であり、内部のすべてのフィールドが最終です)。

recordはまだプレビュー段階にあるため、本番用コードとしては明らかに適切ではありません。ロンボクを使用します。

レコードがプレビューから外れると、さらに複雑になります。ロンボクはFARがより柔軟です。すべてのコードを書き直さなくても、新しい側面で簡単に入れ替えることができます(たとえば、クラスに 'extends'句を追加してから、equalsとhashCodeメソッドを手書きで書く必要はありません。何かのレコードでは得られません)。Lombokにはさらに多くの機能があります。たとえば、@Builder注釈を追加してビルダーを追加できます。レコードでできることではありません。

可能性が非常に低い場合は、設計しているクラスにそのいずれかを使用することになります。レコードを使用します。

免責事項:私はProject Lombokの中心的な貢献者です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.