我在想这样的事情:
record Foo() implements Cloneable {
public Foo clone() {...}
}
这是一件好事吗?我们应该避免它以支持未来的枯萎吗?
除了根本问题Cloneable
之外,还有一个不应该做记录的有力理由Cloneable
:
记录本质上是不可变的。不可变类的最大优点之一是可以不用担心对象身份:任何两个具有相同值的对象都可以完全互换使用。JavaDoc 有一个称为基于值的类的概念,它走得更远(通过禁止公共构造函数并使任何显式使用对象标识成为错误),但确实很好地描述了基本思想。
因此,创建一个clone()
记录只会产生第二个对象,对于所有意图和目的,该对象的行为都应与原始对象完全相同,并且不能更改为不同的行为(因为记录是不可变的)。
这表明没有正当理由clone()
使用Record
.
并且只是为了完整起见:可以(但同样不建议)Cloneable
在记录中实现:
record Foo(String a) implements Cloneable {
public Foo clone() {
try {
return (Foo) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("this can't happen", e);
}
}
}
运行此测试代码证明实际上创建了一个克隆:
Foo original = new Foo("bar");
Foo clonedFoo = original.clone();
System.out.println(original + " / " + clonedFoo);
System.out.println(System.identityHashCode(original) + " / " + System.identityHashCode(clonedFoo));
产生这个输出:
Foo[a=bar] / Foo[a=bar]
670700378 / 1190654826