使用ロンボクの紹介(共通コメント)

ロンボクは、Javaの豆迷惑ゲッター、セッターで自動的に生成された注釈を使用します自動的ロガー、ToStringメソッド、ハッシュコード、Builderおよびその他のJava生成することができ、非常に不思議なJavaクラス・ライブラリである
機能の特性やデザインパターンに合わせて機能を、行うことができますあなたは豆がよりシンプルで美しいJAVA。ロンボクは非常に高度なと思った、それは繰り返しのコードの上にあまりにも多くの時間を費やすことはありません、また、Java言語の進化であるという考えは必然的に80%を行うには、時間の20%を取る、発生します、私たちは退屈な定型的なコードを省略することができます事。ここではロンボクの具体的な使用方法を見てです。

@データ

@dataは非常に便利な注釈であり、それ@ToString、、 @EqualAndHashCode@Getter/@Setter@RequiredArgsConstructor一緒にバインドされています。言い換えれば、データは一般的に、単純なPOJO(プレーン古いJavaオブジェクト)とBeanに関連付けられているすべての定型的なコードを生成し、@、例えば:、すべてのプロパティを取得するのtoStringを達成するために適応するために、すべての非継承プロパティを設定し、等しいとのハッシュコード、すべてのコンストラクタ最終特性を初期化し、すべてを使用せずに@NonNull初期化手順ラベルされた非finalフィールド、フィールドが決してヌルであることを保証します。

@EqualAndHashCode、@Getter、@Setterと@RequiredArgsConstructorコメントとして、クラスに暗黙のよう@toStringを使用し@data。@data = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor

しかし、@データは、このようなcallSuper、includeFieldNamesとして、これらのアノテーションのパラメータを設定し、除外することはできません

あなたがいずれかでこれらのパラメータのデフォルト以外の値を設定する必要がある場合だけで、明示的にこれらのコメントを追加します。

すべての生成されたゲッター/セッターは、注釈への明示的な@Setter @Getter注釈フィールドやクラスで、アクセスレベルをカバーするために、デフォルトで公開されています。あなたはゲッターやセッターの使用を禁止する(AccessLevel.NONEを結合することにより)このコメントを使用することができます。

すべての使用transient印のフィールドはハッシュコードとequalsとして扱われることはありません。完全に(生成のいずれかの方法に関係なく、それらのためのセッター/ゲッターを作成しません)すべての静的フィールドをスキップします。

クラスがすでにメソッドと一般的に同じ名前と数のパラメータで生成された任意の方法が含まれている場合、このメソッドは生成されず、警告またはエラーを発行しません。たとえば:あなたはイコールメソッドをマークし使用している場合、それは技術的には、理由のパラメータの異なる種類の、それは完全に異なるアプローチであっても、equalsメソッドを生成しません。同じ規則は、コンストラクタ(明示的なコンストラクタが停止@Dataを生成します)に適用される、とのtoStringは、等しく、すべてのゲッターとセッター。あなたはロンボク島でそれらを隠すために、@マークlombok.experimental.Tolerate任意のコンストラクタやメソッドを使用することができます

例えば:

import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import lombok.ToString;

@Data
public class DataExample {

    private final String name;

    @Setter(AccessLevel.PACKAGE)
    private int age;

    private double score;

    private String[] tags;

    @ToString(includeFieldNames = true)
    @Data(staticConstructor = "of")
    public static class Exercise<T> {
        private final String name;
        private final T value;
    }

}

これは、ロンボクものではない以下の実施例に相当します。

import java.util.Arrays;

public class DataExample {
  private final String name;
  private int age;
  private double score;
  private String[] tags;
  
  public DataExample(String name) {
    this.name = name;
  }
  
  public String getName() {
    return this.name;
  }
  
  void setAge(int age) {
    this.age = age;
  }
  
  public int getAge() {
    return this.age;
  }
  
  public void setScore(double score) {
    this.score = score;
  }
  
  public double getScore() {
    return this.score;
  }
  
  public String[] getTags() {
    return this.tags;
  }
  
  public void setTags(String[] tags) {
    this.tags = tags;
  }
  
  @Override public String toString() {
    return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + ")";
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof DataExample;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof DataExample)) return false;
    DataExample other = (DataExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (this.getAge() != other.getAge()) return false;
    if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
    if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.getScore());
    result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
    result = (result*PRIME) + this.getAge();
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
    return result;
  }
  
  public static class Exercise<T> {
    private final String name;
    private final T value;
    
    private Exercise(String name, T value) {
      this.name = name;
      this.value = value;
    }
    
    public static <T> Exercise<T> of(String name, T value) {
      return new Exercise<T>(name, value);
    }
    
    public String getName() {
      return this.name;
    }
    
    public T getValue() {
      return this.value;
    }
    
    @Override public String toString() {
      return "Exercise(name=" + this.getName() + ", value=" + this.getValue() + ")";
    }
    
    protected boolean canEqual(Object other) {
      return other instanceof Exercise;
    }
    
    @Override public boolean equals(Object o) {
      if (o == this) return true;
      if (!(o instanceof Exercise)) return false;
      Exercise<?> other = (Exercise<?>) o;
      if (!other.canEqual((Object)this)) return false;
      if (this.getName() == null ? other.getValue() != null : !this.getName().equals(other.getName())) return false;
      if (this.getValue() == null ? other.getValue() != null : !this.getValue().equals(other.getValue())) return false;
      return true;
    }
    
    @Override public int hashCode() {
      final int PRIME = 59;
      int result = 1;
      result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
      result = (result*PRIME) + (this.getValue() == null ? 43 : this.getValue().hashCode());
      return result;
    }
  }
}

@NonNull

あなたはできる@NonNullヌルコンストラクタメソッドを生成するか-チェック

(例えば@Data)はロンボクまたはコンストラクタは、全体的なプロセスを生成する場合、ロンボクは常に上部フィールドは、一般的に信号発生ヌルをチェック@NonNull注釈とみなされると呼びます。しかし、今、lombok.NonNull @ロンボク島に自分のパラメータを使用すると、唯一の独自のメソッドまたはコンストラクタにnullをチェックステートメントを挿入につながります。

ヌル - チェック文は次の文のようになります。

if(param == null){
  throw new NullPointerException("param is marked @NonNull but is null")
}

このステートメントは、メソッドの開始時に空の宣告判断させていただきます

public class NonNullExample {

    @Getter
    private String name;

    public NonNullExample(@NonNull String name){
        this.name = name;
    }
}

この文プラス@NonNull空のコードは、次のコードと同等です

import lombok.NonNull;

public class NonNullExample {
  private String name;
  
  public NonNullExample(@NonNull String name) {
    if (name == null) {
      throw new NullPointerException("name is marked @NonNull but is null");
    }
    this.name = name;
  }
}

@Getter&@Setter

あなたはどのゲッター/セッターを自動的に生成@Getterと@Setterを使用することができます。

フィールド名がfooであれば、デフォルトのゲッターはフィールドの型がboolean型であるならば、)(isFooを返し、、)(からgetfooを返し、フィールドの名前を返します。フィールドがfooの場合、デフォルトのsetFooセッターを返し、型はvoidで、プロパティパラメータとして1と同じフィールドで、属性フィールドは、この割り当てのために使用されています。

あなたがアクセスレベルを指定しない限りACCESSLEVEL、そうでない場合はゲッター/セッターの生成方法は、デフォルトの範囲によって公開されています。ACCESSLEVELアクセスレベルはPUBLICPROTECTEDPACKAGE、とPRIVATE

また、この場合には、それはすべての非静的プロパティのクラスのgetおよびsetメソッドを生成します、クラスで@Getter / @Setterを使用することができます

また、いずれの世代が得る無効とAccessLevel.NONEを設定することで、メソッドを設定することができます。ゲッター/ @Setter障害@注釈データ、@この意志。

public class GetterSetterExample {

    @Setter
    @Getter
    private int age = 10;

    @Setter(AccessLevel.PROTECTED)
    private String name;

    @Getter(AccessLevel.PRIVATE)
    private String high;
}

に相当

public class GetterSetterExample {

  private int age = 10;

  private String name;
  
  private String high;
  
  public int getAge() {
    return age;
  }
  
  public void setAge(int age) {
    this.age = age;
  }
  
  protected void setName(String name) {
    this.name = name;
  }
  
  private String getHigh(){
    return high;
  }
}

@ToString

@ToString注釈は、toString()メソッドを生成実現を置き換えるために使用され、デフォルトでは、それはあなたの名前とカンマで区切られた各フィールドの順、のクラスを出力します。

設定することでincludeFieldNames = true、各フィールドののtoString()メソッドの印刷属性値と名前を可能にします。

デフォルトでは、すべての非静的プロパティを使用すると、特定のフィールドを除外したい場合は、あなたが設定する必要があり、印刷されている@ToString.Exclude、またはあなたが指定できToString(onlyExplicitlyIncluded = true)、指定に使用するフィールドを。次に使う@ ToString.Includeタグが含まれるように、各フィールドを。

設定することでcallSupertrueに、スーパークラスの実装のtoStringの出力は、出力を備えます。、java.lang.Objectのは、()の実装は、任意の意味をなさないので、あなたが別のクラスを拡張する場合を除き、あなたがこれをしないことのtoStringのでご注意ください。

また、出力方法は、内のtoStringを呼び出し含めることができます。使用対象のパラメータなしのみ(非静的)方法であって、実施例@ ToString.Includeタグ方法。

あなたは使用することができます@ToString.Include(name =“some other name”)名前の変更がメンバーを識別するために使用されることができ@ ToString.Include(rank = -1)、プリント注文のメンバーシップを変更します。デフォルトのレベル0の定義されたメンバーは、高い優先度メンバーが順番に同じ優先順位の印刷部材は、それらがソースファイルに表示され、印刷されないことができます。

@ToString
public class ToStringExample {

  // 静态属性不会包含
  private static final int STATIC_VAR = 10;
  private String name;
  private String[] tags;
  private Shape shape = new Square(5, 10);

  // 排除指定字段不会被 toString 打印
  @ToString.Exclude
  private int id;

  public String getName() {
    return this.name;
  }

  // callSuper 表示是否扩展父类的 toString(), 
  // includeFieldNames 表示是否包含属性名称
  @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;
    }
  }

  public static class Shape {}
}

上記の例をテスト

ToStringExample toStringExample = new ToStringExample();
System.out.println(toStringExample);

出力は以下の

ToStringExample(name=null, tags=null, shape=ToStringExample.Square(super=com.project.lombok.ToStringExample$Square@1b9e1916, width=5, height=10))
  • コメントアウトcallSuperを= trueに次のように、テスト結果は、
ToStringExample(name=null, tags=null, shape=ToStringExample.Square(width=5, height=10))

出力からわかるように、親クラスが拡張されていない場合は、、callSuperのデフォルトはfalseを出力形状に関する内部クラス情報ですいません

  • コメントアウトincludeFieldNamesデフォルト値はtrue includeFieldNamesあるので、試験結果は変わりません
  • 偽= includeFieldNamesを変更し、次のように、テスト結果があります
ToStringExample(name=null, tags=null, shape=ToStringExample.Square(super=com.project.lombok.ToStringExample$Square@1b9e1916, 5, 10))

設定includeFieldNamesが= falseの場合、出力からわかるように、フィールド名は、形状情報に出力されません。

@ToString注釈付き修飾の上記の例は、次のコードと等価です

import java.util.Arrays;

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();
  }
  
  public static class Square extends Shape {
    private final int width, height;
    
    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
    
    @Override public String toString() {
      return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";
    }
  }
  
  @Override public String toString() {
    return "ToStringExample(" + this.getName() + ", " + this.shape + ", " + Arrays.deepToString(this.tags) + ")";
  }
  
  public static class Shape {}
}

@EqualsAndHashCode

任意のクラス定義をすることができます@EqualsAndHashCodeのために生成ロンボクせ、マークequalsおよびhashCode方法を。デフォルトでは、マーク非静的、非一過性の分野で使用されますが、あなたはできる@EqualsAndHashCode.Includeか、@EqualsAndHashCode.Excludeマーカータイプのメンバーが使用するフィールドを変更します。また、あなたは正確にフィールドを指定したり、@EqualsAndHashCode(=真onlyExplicitlyIncluded)を使用してEqualsAndHashCode.Include @使用してメソッドを使用するためにそれらをマークすることができます。

@EqualsAndHashCodeが別のクラスを拡張するために適用した場合、この機能は非常に危険になります。一般的に言えば、クラスが自動的に生成equalsし、hashcodeスーパークラスも/ hashCodeメソッド等しい必要フィールドを定義するので、良い選択方法ではありません。設定によってcallSuperを trueに、そして含み得る過程で発生hachcodeスーパー等しいです。スーパークラスの実装は、それは、生成されたメソッドはfalseを返すオブジェクトに渡された等しくないと思われる場合のhashCodeの場合、結果super.hashCodeは、対等のハッシュアルゴリズムを含みます。すべてではないが、この状況を適切に処理することができます実現に等しいことに注意してください。しかし、ロンボク島は、生成されたequalsこれを正しく処理するために実装しました。

あなたは、クラス(のみすべての延長に延びていない場合はjava.lang.Objectロンボクが生成されますので、callSuperがtrueに設定されたクラスを)エラーをコンパイルするように指示されますequals()方法をし、hashCode()お互いに等しいだけ同じObjectオブジェクトと同じハッシュコードを持つ:Objectから継承された変換を実現します。あなたがtrueに他のクラスの警告を継承する場合、親クラスが同じ属性でない場合を除き、ロンボク島は、フィールドの実装を検討していないので、callSuperに設定されていない場合は、あなたのためのスーパークラス宣言を生成しました。あなたは、独自の実装クラスを記述する必要があるかcallSuperツールを利用しています。また、使用することができるlombok.equalsAndHashCode.callSuper構成キーを。

次に例を示します。

@EqualsAndHashCode
public class EqualsAndHashCodeExample {

    private transient int transientVar = 10;
    private String name;
    private double score;
    @EqualsAndHashCode.Exclude private Shape shape = new Square(5,10);
    private String[] tags;
    @EqualsAndHashCode.Exclude private int id;

    public String getName() {
        return 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;
        }
    }

    public static class Shape {}
}

@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor

ロンボク3つの注釈は、それらの使用説明書と、以下の例でコンストラクタ外観を生成しました

@NoArgsConstructor場合は、引数なしでコンストラクタを生成します。final変更されたフィールドが初期化され、最終的にするためのフィールドが変更されていない、単に@NoArgsConstructorノートを使用し、エラーをコンパイルするように指示されます

提案された変更:@NoArgsConstructorプロパティを指定(trueに=フォース)@NoArgsConstructor IDは、int型のIDであるため、ロンボクは、上記のための最終フィールドのデフォルトの初期値を加算0の初期値ように、同様のフィールドの異なるタイプ初期値と同様にfalse / null / 0、このような休止およびサービス提供コンストラクタインタフェースとしてのJavaの具体的な構造は、引数は必要ありません。この注釈@Data主他の構成と組み合わせて機能またはアノテーションを使用して生成されました。

ここで注意すべき場所である:@NoArgsConstructorと一緒に使用しないでください@NonNull

@NoArgsConstructor
@Getter
public class NoArgsConstructorExample {
    private  Long id ;
    private @NonNull String name;
    private Integer age;

    public static void main(String[] args) {
        System.out.println(new NoArgsConstructorExample().getName());
    }
}

出力がnullであるので、あなたがしている場合は@NonNull、変数のメンバーを変更し使用しないように@NoArgsConstructor変更されたクラスを

@RequiredArgsConstructorそれは特別な処理を必要とする各フィールドのコンストラクタパラメータで生成されます。すべて初期化されていない最後のフィールドには、パラメータを取得する、と@NonNullラベルされた任意のフィールドには、パラメータを取得します。それらが宣言されている場合、これらのフィールドは初期化されません。これらのマーク@NonNullフィールドのための特別なヌルのコンパイルチェックを生成します。フラグがある場合は@NonNull、パラメータフィールドがnullの場合、コンストラクタがスローされますNullPointerExceptionがフィールドの順序は、クラスの表示順序でパラメータを一致させます。

例えば、次の例、@NonNullおよび最終変更されたフィールドのみがコンストラクタに追加されます

@RequiredArgsConstructor
public class RequiredArgsConstructorExample {

    @NonNull
    private int id;
    private final String name;
    private boolean human;
    
}

結果はこのような何かを生成しました

public class RequiredArgsConstructorExample {
    @NonNull
    private int id;
    private final String name;
    private boolean human;

    public RequiredArgsConstructorExample(@NonNull int id, String name) {
        if (id == null) {
            throw new NullPointerException("id is marked @NonNull but is null");
        } else {
            this.id = id;
            this.name = name;
        }
    }
}

@AllArgsConstructor:@AllArgsConstructorは、クラス内の各フィールドの一つのパラメータを持つコンストラクタを生成します。@NonNullこれらのパラメータが付いたフィールドは空のチェックになります。

@AllArgsConstructor
public class AllArgsConstructorExample {

    private int id;
    private String name;
    private int age;

}

これは、自動的に生成された次のコードに対応します

public AllArgsConstructorExample(int id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
}

これらの注釈のそれぞれは、代替形態の使用を可能にする、常にプライベートコンストラクタを生成し、そしてプライベートコンストラクタ関数を含む追加の静的ファクトリメソッドを生成され、このモードは、注釈staticnameの値を提供することによってイネーブルされ、@RequiredArgsConstructor(= staticname ) "の"。次の例を見てください

@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  @NoArgsConstructor
  public static class NoArgsExample {
    @NonNull private String field;
  }
}

それはなるだろう

public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  private ConstructorExample(T description) {
    if (description == null) throw new NullPointerException("description");
    this.description = description;
  }
  
  public static <T> ConstructorExample<T> of(T description) {
    return new ConstructorExample<T>(description);
  }
  
  @java.beans.ConstructorProperties({"x", "y", "description"})
  protected ConstructorExample(int x, int y, T description) {
    if (description == null) throw new NullPointerException("description");
    this.x = x;
    this.y = y;
    this.description = description;
  }
  
  public static class NoArgsExample {
    @NonNull private String field;
    
    public NoArgsExample() {
    }
  }
}

品質情報とCSDN無料ダウンロードJavaの許可を提供するために、いいえ公共、あなたは私に従うことが歓迎されていません

参考記事:

https://www.hellojava.com/a/74973.html

https://www.projectlombok.org/features/constructor

おすすめ

転載: www.cnblogs.com/cxuanBlog/p/11272948.html