整理機能javaアイテム2用語

26111 ワード

Telescotting Constructor Pattern(レイヤジェネレータアレイ単位)


これは、
  • によって受信されたパラメータを増加させることによってジェネレータを作成するモードである.
  • という方式は直感的にあまりよくありません.
  • public class Test{
    	private final String fieldA;
        private String fieldB;
        private String fieldC;
        private String fieldD;
        
        public Test(String fieldA){ ... }
        public Test(String fieldA, String fieldB){ ... }
        public Test(String fieldA, String fieldB, String fieldC){ ... }
        public Test(String fieldA, String fieldB, String fieldC, String fieldD){ ... }
    }

    パラメータの順序を誤って変更した場合、コンパイラは気づかず、最終的には実行時に予想外の動作をします。


    2つのタイプのパラメータ(
  • など)を持つコンストラクション関数を呼び出すと、順序が間違っている場合、生成される結果は意図とは異なります.
    public class Test{
        private String fieldA;
        private String fieldB;
        
        public Test(String fieldA, String fieldB){ ... }
    }
    
    Test test = new Test(fieldB, fieldA); // 두 인자의 순서가 바뀜 하지만 컴파일 오류는 없음

    JavaBeans Pattern(JavaBeansモード)

  • パラメータのない作成者を使用してオブジェクトを作成した後、setterメソッドを呼び出して必要なパラメータの値を設定します:
  • .
  • この方法では、1つのオブジェクトを作成するには、複数のメソッドを呼び出す必要があります.
  • オブジェクトが完全に作成されるまで、コンシステンシはクラッシュします.
  • コンシステンシが崩壊した話題はclassを不変の話題にすることはできない.
  • public class Test{
    	private String fieldA;
        private String fieldB;
        
        public Test(){ ... };
        
        public void setFieldA(String fieldA){ ... }
        public void setFieldB(String fieldB){ ... }
    }
    
    Test test = new Test();
    test.setFieldA("");
    test.setFieldB("");

    ビルダー・モード(Builder Pattern)

  • 必須パラメータのみで、ジェネレータを呼び出してコンストラクタオブジェクトを取得できます.
  • 必要なパラメータを
  • コンパイラオブジェクトとして提供する方法を選択します.
  • は、最終的にビルダーオブジェクトのビルダー()としてオブジェクトを取得する.
  • public class NutritionFacts {
        private final int servingSize;
        private final int servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;
    
        public static class Builder {
            private final int servingSize;
            private final int servings;
    
            private int calories = 0;
            private int fat = 0;
            private int sodium = 0;
            private int carbohydrate = 0;
    
            public Builder(int servingSize, int servings) {
                this.servingSize = servingSize;
                this.servings = servings;
            }
    
            public Builder calories(int val) {
                calories = val;
                return this;
            }
    
            public Builder fat(int val) {
                fat = val;
                return this;
            }
    
            public Builder sodium(int val) {
                sodium = val;
                return this;
            }
    
            public Builder carbohydrate(int val) {
                carbohydrate = val;
                return this;
            }
        }
    
        public NutritionFacts(Builder builder) {
            this.servingSize = builder.servingSize;
            this.servings = builder.servings;
            this.calories = builder.calories;
            this.fat = builder.fat;
            this.sodium = builder.sodium;
            this.carbohydrate = builder.carbohydrate;
        }
    }

    FLUENT APIまたはメソッドメカニズム

  • 次のメソッド呼び出しの構文
  • メソッドはオブジェクトを返します(主にこのメソッドです).
  • メソッドがオブジェクトを返す場合、メソッドの戻り値であるオブジェクトから別の関数を呼び出すことができます.
  • シミュレーションself-type習語(シミュレーションself-type慣用句)

  • 継承オブジェクトを上書きする方法
  • .
    public class SimulatedSelfTypeIdiomTest {
        public static abstract class Pizza {
            public enum Topping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE}
    
            final Set<Topping> toppings;
    
            abstract static class Builder<T extends Builder<T>> {
                EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
    
                public T addTopping(Topping topping) {
                    toppings.add(Objects.requireNonNull(topping));
                    return self();
                }
    
                abstract Pizza build();
    
                // sub class는 이 method를 overriding하여
                // "this"를 반환하도록 해야 한다.
                protected abstract T self();
            }
    
            Pizza(Builder<?> builder) {
                // 불변식 보장을 위해 매개변수 복사
                toppings = builder.toppings.clone();
            }
        }
    
        public static class NYPizza extends Pizza {
            public enum Size {SMALL, MEDIUM, LARGE}
    
            private final Size size;
    
            public static class Builder extends Pizza.Builder<Builder> {
                private final Size size;
    
                public Builder(Size size) {
                    this.size = Objects.requireNonNull(size);
                }
    
                @Override
                public NYPizza build() {
                    return new NYPizza(this);
                }
    
                @Override
                protected Builder self() {
                    return this;
                }
            }
    
            private NYPizza(Builder builder) {
                super(builder);
                size = builder.size;
            }
        }
    }

    コヒーレント戻りタイプ(共通戻りタイプ)

  • で上書きされたメソッドの戻りタイプをサブクラスのメソッド定義のタイプに返す機能.
  • protected abstract T self();
    
    @Override
    protected Builder self() {
    	return this;
    }