即使它是一个 bean,因此不是一成不变的,我也有一个替代方案:冻结/解冻模式。
如果您为您的对象实现它(这将需要您使用构建器类),您可以执行以下操作:
final MyObject copy = orig.thaw().freeze();
Cloneable
我发现它甚至比构建器(这是一个可逆的构建器)更方便,并且经常使用这种模式。
作为奖励,您可以使您的对象不是 bean,因此是不可变的。我个人对豆类有一种深深的厌恶,这就是我想出那个的原因……
而且这种模式也是递归的。让我们假设您有类Out
,In
其中In
的成员是Out
. 让我们说In
服从冻结/解冻。然后你的代码Out
变成:
public final class Out
implements Frozen<Builder>
{
private final In in;
private Out(final Builder builder)
{
in = builder.in.freeze();
}
public static newBuilder()
{
return new Builder();
}
public In getIn()
{
return in;
}
@Override
public Builder thaw()
{
return new Builder(this);
}
public static final class Builder
implements Thawed<Out>
{
private In.Builder in;
private Builder()
{
}
private Builder(final Out out)
{
in = out.in.thaw();
}
public Builder setIn(final In in)
{
this.in = in.thaw();
}
@Override
public Out freeze()
{
return new Out(this);
}
}
}
最终结果是调用copy = orig.thaw().frezze()
返回一个相同的副本,其中包含in
.