注釈。パート 1、少し退屈 このパートでは、Source アノテーションの代表としてよく知られている Lombok ライブラリについて触れることにしました。ランタイムの注釈については次の記事で説明します。昔々、Java プログラマーがいて、毎日、次のような普通のコードを書きました。
以下に簡単な紹介と詳細へのリンクを記載しますので、読者の皆様が興味を持っていただければ幸いです。Lombok は生成をカスタマイズする機会も提供します。すべてのゲッター、セッター、またはハッシュコードを常に異なる方法で生成する必要はありません。したがって、個別のアノテーションがあります(多くは説明が必要ないと思います) @Getter/@Setter @ToString @EqualsAndHashCode @NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor @Log これらは最も典型的なもので、セット全体を表示できますここで、 var と val は特別な注意に値します。次のように書くことが可能です:
package lombok;
public class Chelovek {
private String name;
private int age;
public Chelovek(String name, int age) {
this.name = name;
this.age = age;
}
public Chelovek() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Chelovek chelovek = (Chelovek) o;
if (age != chelovek.age) return false;
return name != null ? name.equals(chelovek.name) : chelovek.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Chelovek{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
これは、フィールドが 2 つしかない典型的なクラスです (ただし、フィールドが 10 ~ 15 を超える場合もあります)。もちろん、これらはすべて IDE で生成できますが、スペースを消費します。15 ~ 20 個のフィールドがある場合、それらのすべてにゲッター、セッター、コンストラクターが必要です...これらすべての中で、目に見えない他のいくつかのメソッドは簡単に失われる可能性があります。このようなプログラマーがより速く、より少ない記述を行えるようにするにはどうすればよいでしょうか? ロンボク島。そのままヒートに突入、同じクラスだがロンボク島を使用:
package lombok;
@Data
public class Chelovek {
private String name;
private int age;
}
はい、それだけです。いいね?@Dataアノテーションは何をするのでしょうか ? コンパイル段階では、すべてのフィールド、toString のゲッター/セッターを生成し、標準に従って、equals と hashCode を再定義します。IDE にプラグインをインストールすると、まだ作成されていないすべてのメソッドが表示されます。
package lombok;
import lombok.experimental.var;
@Data
public class Chelovek {
private String name;
private int age;
public static void main(String[] args) {
var chelovek = new Chelovek();
chelovek.setAge(22);
System.out.println(chelovek);
}
}
なぜこれが必要なのでしょうか? たとえば、RandomAccessFileChannel クラスがありますが、なぜ次のように記述する必要があるのでしょうか。
RandomAccessFileChannel channel = new RandomAccessFileChannel();
可能であれば次のようにします。
var channel2 = new RandomAccessFileChannel();
私の意見では、これは必ずしも受け入れられるものではありません。たとえば、邪悪なマップを返す邪悪なメソッドがあります。
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap(){
return new HashMap<>();
}
次のように呼び出した場合:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
私たちが何に取り組んでいるのかは、多かれ少なかれ明らかです。呼び出しが次のような場合:
var listSetMap = evilMap();
では、evilMap() が何を返すかは誰にもわかりませんが、メソッド自体を見てみないとわかりません。なぜわざわざソースを調べる必要があるのでしょうか? 一般に、これについてはより注意する必要があります。 実験スレッド: ここで注釈に注目したいと思います: @UtilityClass これはプライベート コンストラクターを作成し、そこで例外をスローします (反射によって汚れた手がここに侵入しないように)。そして、クラスの冒頭で、ユーティリティ メソッドがあることを非常にうまく伝えています。 @Delegate 委任パターンを実装します。一部のメソッドにのみ変更を加えながら、別のクラスに何かを委任するクラスがある場合、このアノテーションによりメソッドの重複を避け、メソッドを追跡できます。メソッドが削除または追加されると、彼女はそれに気づきます。 実験的な注釈スレッド GITHUB 公式 Web サイト IDE が lombok で正常に動作し、メソッドが存在しないものとして強調表示されないようにするには、プラグインをインストールする必要があります。公式サイトには、各IDEのプラグインの接続方法が記載されているセットアップセクションがあり、Lombokが人気があることがわかります。>5000 スターと >1000 フォーク。Spring さんはクラスでロンボクを使用しています。プロジェクトにバネがある場合は、それを探してください。おそらくロンボク川を引き上げたものかもしれませんが、それはわかりません。
GO TO FULL VERSION