Как правило, класс, построенный из Builder, не обладает какими-либо специализированными знаниями о Builder. То есть, в Immutable есть конструктор для предоставления значения для foo и bar:
public final class MyImmutable {
public final int foo;
public final int bar;
public MyImmutable(int foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
Строителем будет отдельный класс:
public class MyImmutableBuilder {
private int foo;
private int bar;
public MyImmutableBuilder foo(int val) { foo = val; return this; }
public MyImmutableBuilder bar(int val) { bar = val; return this; }
public MyImmutable build() { return new MyImmutable(foo, bar); }
}
Если вы хотите, вы можете добавить статический метод в конструктор MyImmutable, чтобы запустить его из существующего экземпляра MyImmutable:
public static MyImmutableBuilder basedOn(MyImmutable instance) {
return new MyImmutableBuilder().foo(instance.foo).bar(instance.bar);
}