如何创建构建者链

时间:2019-03-14 00:25:09

标签: java generics builder-pattern

我想创建一个构建器链,在其中我可以根据i的值提供不同的方法集。如果可以使用这些中间生成器类,则可以在编译时限制可用方法,而不是依赖运行时检查。 (中间构建器类无意向最终用户公开,它们只是在调用set()之后提供不同的方法集。)

public class SomeClass {
    public static class SomeClassBuilder {
        public <What should I return ?> set(int i) {
            switch (i) {
               case 1:
                   return new Case1Builder();
                   break;
               case 2:
               case 3:
                   return new Case2And3Builder();
                   break;
               case 4:
                   return new Case4Builder();
                   break;
               default:
                   return this;
            }
        }

        public SomeClass.SomeClassBuilder build() {
        }
    }

    public static final class Case1Builder() {
        public SomeClass.Case1Builder set1() {
        }
    }

    public static final class Case2And3Builder() {
        public SomeClass.Case1Builder set2And3() {
        }
    }

    public static final class Case4Builder() {
        public SomeClass.Case1Builder set4() {
        }
    }
}

然后从驱动程序类中,我可以执行以下操作:

final SomeClass someClass = new SomeClass.SomeClassBuilder(1).set1().build();
final SomeClass someClass = new SomeClass.SomeClassBuilder(2).set2And3().build();

有可能吗?也许使用泛型?

2 个答案:

答案 0 :(得分:1)

不可能。您可以返回几种类型之一,但是由于返回类型是编译时的,因此您必须声明这些类型的超类型。这里就是Object。显然,返回Object是没有用的。

您不能返回三种类型之一,并且期望编译器能够根据返回的三种类型中的哪一种来提供对不同方法的访问。实际返回的类型是运行时工件,而您可以调用的方法列表则是编译时的决定。

如果要执行此操作,则需要多个set方法。

public Case1Builder set1();
public Case2And3Builder set2Or3();
public Case4Builder set4();
public GenericCaseBuilder setOther();

答案 1 :(得分:-1)

要以尝试完成任务的方式进行操作,您需要执行以下操作:

public class SomeClass {
    public static class SomeClassBuilder implements CaseBuilder {
        public CaseBuilder set(int i) {
            switch (i) {
               case 1:
                   return new Case1Builder();
                   break;
               case 2:
               case 3:
                   return new Case2And3Builder();
                   break;
               case 4:
                   return new Case4Builder();
                   break;
               default:
                   return this;
            }
        }

        @Override
        public SomeClass build() {...}
    }

    public static final class Case1Builder() implements CaseBuilder {
        @Override
        public SomeClass build() {...}
    }

    public static final class Case2And3Builder implements CaseBuilder {
        @Override
        public SomeClass build() {...}
    }

    public static final class Case4Builder implements CaseBuilder {
        @Override
        public SomeClass build() {...}
    }


   public interface CaseBuilder {
      public SomeClass build();
   }
}

但是,这比需要的复杂得多,并且实际上不是Builder模式。我认为您正在寻找的实际上是Factory pattern,或者可能是FactoryFactory。