Java可克隆,无需实现



我正在从 c++ 迁移到 java,并认为自己是一个 Java 菜鸟。我最近一直在查看一个庞大的代码库,其中包含几个没有实现clone函数的那种public class Myclass implements Cloneable{...}示例。我不明白这种模式的优点。有吗?如果您选择不实现clone函数,为什么要从Cloneable派生它?还有没有提供一些默认clone函数的龙目岛注释?

如果类未实现Cloneable接口,则对该类的实例调用clone会导致CloneNotSupportedExceptionjava.lang.Object已经实现了clone方法(此方法不是抽象的),因此不需要子类来实现它。java.lang.Objectclone方法执行实例的浅表副本。

如果你选择不实现克隆函数,为什么要从 可克隆?

clone()方法不是从Cloneable接口派生的。
它来自Object类。
Cloneable只是一个标记接口。
如果在类的实例上调用clone()方法,则在运行时使用它来验证行为。
Java 已选择一个设计模型,默认情况下对象拥有clone()方法。这是一个你可能喜欢或不喜欢的设计选择,但无论如何,它是这样的
具体来说,如果你在一个对象上调用clone()并且对象的类没有实现Clonable,JVM将在运行时抛出CloneNotSupportedException异常。同样,如果某些类的方法之一未实现,则某些类会抛出UnsupportedOperationException

还有没有提供一些默认克隆的龙目岛注释 功能?

默认情况下,clone()执行当前对象的浅表复制。也就是说,将为要克隆的对象创建一个新实例,但不会克隆它拥有的所有对象字段。实际上,克隆对象的字段仍然引用与原始实例中的对象相同的对象。只有具有基元类型(intfloatboolean等)的字段才会被克隆。
如果您需要在clone()方法中具有不同的行为,龙目岛无法猜测您想要的行为是什么。因此,不,使用它来生成clone()方法的实现是没有意义的。

龙目岛实际上有一个@Wither注释: https://projectlombok.org/features/experimental/Wither.html

但您也可以创建一个将参数传递给构造函数的新对象。

最新更新