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背景紹介
公式の紹介は以下の通りです.
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プラグインを使用するには、次の手順に従います.
  • LombokプラグインをIDEA
  • にインストール
    file -> setting
    

    Pluginsを選択し、Lombokを検索し、Installをクリックします
  • デフォルトのコンパイル方式をjavacとして選択します.eclipseはLombokのコンパイル方式をサポートしないため、javacはLombokのコンパイル方式をサポートします.
  • 注記ジェネレータEnable annotation processing
  • を開く
    もう一度注意:
    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;
    
        }
    
    }