過度-builderモードを解決するためのJavaコンストラクタのパラメータ(効果Javaの研究は2ノート)

まず、展望:

  通常、我々は静的なファクトリメソッドを使用して、このような状況に遭遇していないか、コンストラクタで十分です。しかし、彼らはまた、制限は、彼らはオプションのパラメータのシーン番号にうまくスケールしないことである持っています。私たちのビジネスの発展に伴い、Javaの豆のパラメータのいくつかは、より多くのだろう、我々はコンストラクタも対応して増加している追加します。10コンストラクタの引数、I胃を考えます。

  あなたはビルダーモードを使用したいので、我々は最初の従来の方法の欠点を知っておく必要があります。


ビルダーVS第二に、拡張性の高いモデルのコンストラクタ

  私たちは、コード例に話をする必要があり

図1に示すように、伸縮工法

public class Student {
    private final String name; // required
    private final String sex;  // required
    private final int weight;  // optional
    private final int height;  // optional 
    private final int age;     // optional

    public Student(String name, String sex) {
        this(name, sex, 0);
    }
    
    public Student(String name, String sex, int w) {
        this(name, sex, w, 0);
    }
    
    public Student(String name, String sex, int w, int h) {
        this(name, sex, w, h, 0);
    }

    public Student(String name, String sex, int w, int h, int a) {
        this.name = name;
        this.sex = sex;
        this.weight = w;
        this.height = h;
        this.age = a;
    }
}
复制代码

私たちは学生のインスタンスを作成したいときは、次のようにして最短十分のすべてのパラメータを設定することができます。

Student student = new Student("小明", "男", 50, 150, 16);

  通常の状況下では、この工法は、パラメータの増加と、それはすぐに制御不能になり、(それは少し不快ではない)パラメータを設定したくないあなた方の多くを必要とするかもしれません。(あなたは狂気を行くだろう)。まず、それはこのアプローチを理解することは困難である逆の二つのパラメータが続く場合、コンパイラは与えられていませんこのような身長と体重など、後方Zaoxinを埋めます。

2、JavaBeanのモデル

  コンストラクタ内のオプションのパラメータの数に直面したとき、別のオプションモードをJavaBeansの、このモードでは、自由パラメータオブジェクトを作成するためのコンストラクタを呼び出し、その後、必要なパラメータを設定し、それぞれのためにセッターを呼び出しますオプションのパラメータ:

public class Student {
    private  String name; // required
    private  String sex;  // required
    private  int weight;  // optional
    private  int height;  // optional
    private  int age;     // optional

    public Student() {}


    public void setName(String name) {
        this.name = name;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
复制代码

このモード1無欠点のコンストラクタ。少し長いが、インスタンスを作成しやすく、読みやすいです

        Student student = new Student();
        student.setName("小明");
        student.setSex("男");
        student.setAge(16);
        student.setWeight(50);
        student.setHeight(150);
复制代码

  JavaBeansのモデル自体は重大な欠陥があります。コンストラクタコールので、複数回に分割されているので、建設JavaBeanの間に不整合な状態であってもよいです。このクラスは、パラメータで設定パラメータの妥当性を一貫性チェックを実行するためのオプションではありません。矛盾した状態でオブジェクトを使用しようとすると、エラーバグのないコードは非常に異なって含まれている可能性があり、それはデバッグが困難です。関連の欠点は、JavaBeansのパターンは不変クラスを作成する可能性、およびスレッドの安全性を確保するために、プログラマの一部に作業を向上させる必要性を排除する、ということです

3、ビルダーモード

  モデルビルダースケーラブルなセキュリティモデルの構築方法と可読性のJavaBeanのモードを結合。

public class Student {
    private final String name;
    private final String sex;
    private  final int weight;
    private final int height;
    private  final int age;

    private Student(Builder builder) {
        this.name = builder.name;
        this.sex = builder.sex;
        this.weight = builder.weight;
        this.height = builder.height;
        this.age = builder.age;
    }
    
    public static class Builder {
        private final String name; // required
        private final String sex;  // required
        private int weight;  // optional
        private int height;  // optional
        private int age;     // optional

        public Builder(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }

        public Builder setWeight(int weight) {
            this.weight = weight;
            return this;
        }

        public Builder setHeight(int height) {
            this.height = height;
            return this;
        }
        
        public Builder setAge(int age) {
            this.age = age;
            return this;
        }
        
        public Student build() {
            return new Student(this);
        }

    }
}
复制代码

  まず、コードの量を倍増し、私はそれをスプレーしてみましょう。Studentクラスは不変である。しかし、すべてのパラメータのデフォルト値は、一つの場所にあります。ビルダーのセッターメソッドは、ビルダー自身を返し、この呼び出しは流暢なAPIを生成するために一緒にリンクすることができます。例としては、次のとおりです:

Student student = new Student.Builder("小明", "男").setWeight(50)
                .setHeight(150).setAge(16).build();
复制代码

  コードを書くのは簡単ですが、もっと重要なのは読みやすいです。アナログモードでのビルダーPythonとScalaはオプションのパラメータの名前。の妥当性をチェックする心配がありません


要約:

  工法上にわずかな利点をビルダー各パラメータを独自の方法で指定されているので、ビルダーは、複数の可変パラメータを有することが可能です。

  Builderのモードは非常に柔軟です。個々のオブジェクトの複数ビルダー再利用を構築することができます。ビルダーのパラメータが作成されたオブジェクトを変更する方法を構築するための呼び出しの間で調整することができます。あなたがオブジェクトを作成し、オブジェクトを作成するときにビルダーが自動的にいくつかのプロパティを入力することができ、例えば、それぞれの時間は、シーケンス番号を増やします。

  Builderのモデルにも欠点があります。オブジェクトを作成するには、まずそのビルダーを作成する必要があります。が、このビルダーを作成するコストは、実際に気づいたことはほとんどありませんが、問題は危機的状況のパフォーマンスに発生する可能性があります。また、ビルダーモードは、コンストラクタの伸縮モードよりも冗長なので、パラメータは、それを使用して価値がある場合は、そのような4以上のように、十分がある場合のみ。あなたが将来的にはより多くのパラメータを追加したい場合はしかし、覚えておいてください。あなたは、コンストラクタまたは静的工場からスタートし、ビルダーに切り替えた場合は、ときに、コントロールのうちパラメータの数の進化への授業時間は、日付のコンストラクタまたは静的工場の外に恥ずかしい状況に直面するだろう。したがって、それは最初からビルダーを作成するのが最善です。

  クラスのコンストラクタまたはより少数の植物の静的パラメータを設計する際に結論として、ビルダーモードでは、多くのパラメータが同じまたは別のタイプの場合は特に、良い選択です。伸縮工法(伸縮コンストラクタ)ビルダーのJavaBeansより読みやすく、かつ安全を使用するよりもクライアント・コード。

PS:マイクロチャンネルを読んブッククラブができている場合は、マイクロチャネルの研究グループポータル組織を見つけること。

おすすめ

転載: juejin.im/post/5d5647c6f265da03c5030b53
おすすめ