I would like to create builder chain where I can provide different sets of methods based on the value of i
. If I can use these intermediate builder classes then I can limit the available methods at compile-time rather than relying on runtime checks. (The intermediate builder classes aren't intended to be exposed to the end user, they're just there to provide different sets of methods after calling 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() {
}
}
}
And then from my driver class, I could do below:
final SomeClass someClass = new SomeClass.SomeClassBuilder(1).set1().build();
final SomeClass someClass = new SomeClass.SomeClassBuilder(2).set2And3().build();
Is it possible? Maybe using generics?