这是不可变类和Builder模式的有效Java实现吗? [英] Is this a valid Java implementation of an immutable class and the Builder pattern?
问题描述
Builder实现Cloneable并覆盖clone(),而不是复制构建器的每个字段,不可变类保留构建器的私有克隆。这样可以很容易地返回一个新构建器并创建一个不可变实例的略微修改过的副本。
The Builder implements Cloneable and overrides clone() and instead of copying every field of the builder, the immutable class keeps a private clone of the builder. This makes it easy to return a new builder and create slightly modified copies of an immutable instance.
这样我可以去
MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();
据说Cloneable接口有些破坏,但这些都违反了良好的java编码习惯,这个结构有什么问题吗?
The Cloneable interface is said to be somewhat broken, but does any of this violate good java coding practice, are there any problems with this construct?
final class MyImmutable {
public int foo() { return builder.foo; }
public int bar() { return builder.bar; }
public Builder builder() { return builder.clone(); }
public static final class Builder implements Cloneable {
public Builder foo(int val) { foo = val; return this; }
public Builder bar(int val) { bar = val; return this; }
public MyImmutable build() { return new MyImmutable(this.clone()); }
private int foo = 0;
private int bar = 0;
@Override public Builder clone() { try { return (Builder)super.clone(); } catch(CloneNotSupportedException e) { throw new AssertionError(); } }
}
private MyImmutable(Builder builder) { this.builder = builder; }
private final Builder builder;
}
推荐答案
一般来说,这个类是由Builder没有任何关于构建器的专业知识。那就是Immutable将有一个构造函数来为foo和bar提供值:
Generally the class constructed from the Builder doesn't have any specialized knowledge of the builder. That is Immutable would have a constructor to supply the value for foo and 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;
}
}
构建器将是一个单独的类:
The builder would be a separate class:
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实例:
If you wanted, you could add a static method to MyImmutable builder to start from an existing MyImmutable instance:
public static MyImmutableBuilder basedOn(MyImmutable instance) {
return new MyImmutableBuilder().foo(instance.foo).bar(instance.bar);
}
这篇关于这是不可变类和Builder模式的有效Java实现吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!