CTO:Javaコードにset/getメソッドを書かないで、罰金を一度捕まえて...
5821 ワード
image.png
前言
what?あなたのJavaコードにはset/getメソッドがたくさんありますか?
私たちはJava言語を勉強し始めたばかりの頃、オブジェクト向けの3つの特徴はパッケージ、継承、多態です.Javaでは、パッケージング性を保証するには、メンバー変数を私有化し、set/getメソッドを外部に提供してアクセスする必要があります.現在のIDEでは、eclipseのようにIDEAにショートカットキーが提供され、set/getメソッドを生成しますが、プロジェクトを行うとき、JavaBeanには多くのメンバー変数があり、1つの変数は2つのメソッドに対応し、10個のメンバー変数があれば、20以上の方法に対応し、コンストラクタやequalsなどの方法を書く必要があり、メンテナンスが必要かもしれません.これにより,コードが非常に冗長になり,これらは冗長に見え,技術的な含有量も多くなく,属性を修正すると対応方法の修正を忘れがちなミスが生じる.
私は大物のプロジェクトのソースコードを見たとき、彼らのコードにはset/getの方法がないのを見て、代わりにJavaBeanに表記された注釈を見て、私はとても好奇心を感じて、もとは彼らはLombokというプラグインを使って、このプラグインを詳しく理解しました.
Lombok背景紹介
公式の紹介は以下の通りです.
Lombokは「プロセッサ」を追加することで、Javaを簡潔かつ迅速にすることができます.
Lombokの使い方
Lombokは注釈でコンパイル時に自動的に属性にコンストラクタ,getter/setter,equals,hashcode,toStringメソッドを生成することができる.不思議なことに、ソースコードにはgetterメソッドとsetterメソッドはありませんが、コンパイル生成されたバイトコードファイルにはgetterメソッドとsetterメソッドがあります.これにより、これらのコードを手動で再構築する手間が省け、コードがより簡潔に見えます.
Lombokの使用はjarパッケージを参照するのと同じで、公式サイト(https://projectlombok.org/download)jarパッケージをダウンロードするか、mavenを使用して依存を追加することもできます.
注意:
初めてLombokプラグインを使用するには、次の手順に従います. LombokプラグインをIDEA にインストール
Pluginsを選択し、Lombokを検索し、Installをクリックしますデフォルトのコンパイル方式をjavacとして選択します.eclipseはLombokのコンパイル方式をサポートしないため、javacはLombokのコンパイル方式をサポートします. 注記ジェネレータEnable annotation processing を開く
もう一度注意:
IntelliJ IDEA 2019.2(つまり私が使っているバージョン)デフォルトではLombokプラグインはサポートされていません.
対応するバージョンのプラグインをダウンロードし、手動で導入し、IDEAでFile->Settings->plugin from Diskを選択します(バージョンによって異なる場合があります)
次に、Lombokの注釈の具体的な使い方を分析します.
@Data
@Data注記クラスでは、クラスのすべてのプロパティに対してsetter/getter、equals、canEqual、hashCode、toStringメソッドが自動的に生成されます.finalプロパティの場合、setterメソッドは生成されません.
例えば私たちは学生クラスを書きます
これでset/getメソッドを呼び出すことができます.
@Getter/@Setter
@Dataが残虐すぎる(@Data集合@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructorのすべての特性のため)と感じる場合は、@Getter/@Setter注釈を使用します.この注釈は属性上、対応する属性に対してset/getメソッドを自動的に生成できます.
@NonNull
この注記はプロパティまたはコンストラクタに使用され、Lombokは空でない宣言を生成し、パラメータを検証し、空のポインタを避けるのに役立ちます.
@Cleanup
この注釈はclose()メソッドを自動的に呼び出すのに役立ち,コードを大幅に簡略化した.
@EqualsAndHashCode
デフォルトでは、equalsおよびhashCodeは、すべての非静的(non-static)および非過渡的(non-transient)属性を使用して生成されます.また、exclude注釈によっていくつかの属性を除外することもできます.
@ToString
クラスは@ToString注記を使用し、LombokはtoString()メソッドを生成します.デフォルトでは、クラス名、すべての属性(属性定義順)が出力され、カンマで分割されます.
includeFieldNameパラメータをtrueに設定することで、toString()プロパティを明確に出力できます.この点は少し迂回しているのではないでしょうか.コードで見るともっとはっきりします.
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
無パラメトリックコンストラクタ、部分パラメータコンストラクタ、全パラメトリックコンストラクタ.Lombokは複数のパラメータコンストラクタの再負荷を実現できない.
前言
what?あなたのJavaコードにはset/getメソッドがたくさんありますか?
私たちはJava言語を勉強し始めたばかりの頃、オブジェクト向けの3つの特徴はパッケージ、継承、多態です.Javaでは、パッケージング性を保証するには、メンバー変数を私有化し、set/getメソッドを外部に提供してアクセスする必要があります.現在のIDEでは、eclipseのようにIDEAにショートカットキーが提供され、set/getメソッドを生成しますが、プロジェクトを行うとき、JavaBeanには多くのメンバー変数があり、1つの変数は2つのメソッドに対応し、10個のメンバー変数があれば、20以上の方法に対応し、コンストラクタやequalsなどの方法を書く必要があり、メンテナンスが必要かもしれません.これにより,コードが非常に冗長になり,これらは冗長に見え,技術的な含有量も多くなく,属性を修正すると対応方法の修正を忘れがちなミスが生じる.
私は大物のプロジェクトのソースコードを見たとき、彼らのコードにはset/getの方法がないのを見て、代わりにJavaBeanに表記された注釈を見て、私はとても好奇心を感じて、もとは彼らはLombokというプラグインを使って、このプラグインを詳しく理解しました.
Lombok背景紹介
公式の紹介は以下の通りです.
Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.
Lombokは「プロセッサ」を追加することで、Javaを簡潔かつ迅速にすることができます.
Lombokの使い方
Lombokは注釈でコンパイル時に自動的に属性にコンストラクタ,getter/setter,equals,hashcode,toStringメソッドを生成することができる.不思議なことに、ソースコードにはgetterメソッドとsetterメソッドはありませんが、コンパイル生成されたバイトコードファイルにはgetterメソッドとsetterメソッドがあります.これにより、これらのコードを手動で再構築する手間が省け、コードがより簡潔に見えます.
Lombokの使用はjarパッケージを参照するのと同じで、公式サイト(https://projectlombok.org/download)jarパッケージをダウンロードするか、mavenを使用して依存を追加することもできます.
org.projectlombok
lombok
1.18.10
provided
注意:
初めてLombokプラグインを使用するには、次の手順に従います.
file -> setting
Pluginsを選択し、Lombokを検索し、Installをクリックします
もう一度注意:
IntelliJ IDEA 2019.2(つまり私が使っているバージョン)デフォルトではLombokプラグインはサポートされていません.
https://plugins.jetbrains.com/plugin/6317-lombok/versions
対応するバージョンのプラグインをダウンロードし、手動で導入し、IDEAでFile->Settings->plugin from Diskを選択します(バージョンによって異なる場合があります)
次に、Lombokの注釈の具体的な使い方を分析します.
@Data
@Data注記クラスでは、クラスのすべてのプロパティに対してsetter/getter、equals、canEqual、hashCode、toStringメソッドが自動的に生成されます.finalプロパティの場合、setterメソッドは生成されません.
例えば私たちは学生クラスを書きます
@Data
public class Student {
private String name;
private Integer age;
private Integer id;
private String major;
}
これでset/getメソッドを呼び出すことができます.
@Getter/@Setter
@Dataが残虐すぎる(@Data集合@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructorのすべての特性のため)と感じる場合は、@Getter/@Setter注釈を使用します.この注釈は属性上、対応する属性に対してset/getメソッドを自動的に生成できます.
public class Student {
@Setter private String name;
private Integer age;
private Integer id;
private String major;
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Mr.ml");
}
}
@NonNull
この注記はプロパティまたはコンストラクタに使用され、Lombokは空でない宣言を生成し、パラメータを検証し、空のポインタを避けるのに役立ちます.
public class Student {
@Setter private String name;
private Integer age;
private Integer id;
private String major;
public Student(@NonNull String name) {
this.name = name;
}
}
@Cleanup
この注釈はclose()メソッドを自動的に呼び出すのに役立ち,コードを大幅に簡略化した.
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
@EqualsAndHashCode
デフォルトでは、equalsおよびhashCodeは、すべての非静的(non-static)および非過渡的(non-transient)属性を使用して生成されます.また、exclude注釈によっていくつかの属性を除外することもできます.
@EqualsAndHashCode(exclude={"id", "shape"})
public class EqualsAndHashCodeExample {
private transient int transientVar = 10;
private String name;
private double score;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
public String getName() {
return this.name;
}
@EqualsAndHashCode(callSuper=true)
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
}
@ToString
クラスは@ToString注記を使用し、LombokはtoString()メソッドを生成します.デフォルトでは、クラス名、すべての属性(属性定義順)が出力され、カンマで分割されます.
includeFieldNameパラメータをtrueに設定することで、toString()プロパティを明確に出力できます.この点は少し迂回しているのではないでしょうか.コードで見るともっとはっきりします.
@ToString(exclude="id")
public class ToStringExample {
private static final int STATIC_VAR = 10;
private String name;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
public String getName() {
return this.getName();
}
@ToString(callSuper=true, includeFieldNames=true)
public static class Square extends Shape {
private final int width, height;
public Square(int width, int height) {
this.width = width;
this.height = height;
}
}
}
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
無パラメトリックコンストラクタ、部分パラメータコンストラクタ、全パラメトリックコンストラクタ.Lombokは複数のパラメータコンストラクタの再負荷を実現できない.
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}