2

我在谷歌上找不到任何关于使用记录的材料。Cloneable

我在想这样的事情:

record Foo() implements Cloneable {
    public Foo clone() {...}
}

这是一件好事吗?我们应该避免它以支持未来的枯萎吗?

4

1 回答 1

8

除了根本问题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
于 2021-04-30T13:41:41.907 回答