Java可克隆,无需实现 我正在从C++迁移到java,并把自己看作java NoOB。我最近一直在研究一个庞大的代码库,其中有几个示例是公共类Myclass实现了可克隆的{…},而没有实现克隆函数。我不理解这种模式的优点。有吗?如果选择不实现clone功能,为什么要从Cloneable派生它?还有任何lombok Anotation提供了一些默认的clone函数吗?
如果一个类没有实现Java可克隆,无需实现 我正在从C++迁移到java,并把自己看作java NoOB。我最近一直在研究一个庞大的代码库,其中有几个示例是公共类Myclass实现了可克隆的{…},而没有实现克隆函数。我不理解这种模式的优点。有吗?如果选择不实现clone功能,为什么要从Cloneable派生它?还有任何lombok Anotation提供了一些默认的clone函数吗?,java,design-patterns,cloneable,Java,Design Patterns,Cloneable,如果一个类没有实现Cloneable接口,在类的实例上调用clone会导致CloneNotSupportedException。java.lang.Object已经实现了一个clone方法(该方法不是抽象的),因此不需要子类来实现它。java.lang.Object方法执行实例的浅层复制。lombok中实际上有一个@Wither注释: 但您也可以创建一个新对象,将参数传递给构造函数 如果选择不实现克隆功能,为什么要从 可克隆的 clone()方法不是从Cloneable接口派生的。它来自对象类
Cloneable
接口,在类的实例上调用clone
会导致CloneNotSupportedException
。java.lang.Object
已经实现了一个clone
方法(该方法不是抽象的),因此不需要子类来实现它。java.lang.Object
方法执行实例的浅层复制。lombok中实际上有一个@Wither注释:
但您也可以创建一个新对象,将参数传递给构造函数 如果选择不实现克隆功能,为什么要从 可克隆的
clone()
方法不是从Cloneable
接口派生的。它来自
对象
类。Cloneable
只是一个标记接口如果对类的实例调用了
clone()
方法,则在运行时使用它来验证行为。Java选择了一个设计模型,默认情况下对象拥有
clone()
方法。这是一个你可能喜欢或不喜欢的设计选择,但无论如何,它是这样的具体地说,如果在对象上调用
clone()
,而该对象的类没有实现Clonable
,JVM将在运行时抛出CloneNotSupportedException
异常。同样,如果某些类的某个方法未实现,则它们会抛出UnsupportedOperationException
。还有提供一些默认克隆的lombok Anotation吗 功能 默认情况下,
clone()
执行当前对象的浅层复制。也就是说,将为要克隆的对象创建一个新实例,但不会克隆它所拥有的所有对象字段。实际上,克隆对象的字段仍然引用与原始实例中相同的对象。仅克隆具有基本类型(int
、float
、boolean
等)的字段。如果您需要在
clone()
方法中有不同的行为,Lombok无法猜测您想要的行为是什么。因此,不,使用它来生成clone()
方法的实现毫无意义。但是克隆方法在对象类中不受保护。这将自动防止MyClass
的任何使用者调用clone函数。对,但由于它受到保护,子类可以在其实现中调用它。如果其他类需要调用它,可以重写它并使其成为公共的,因此,实现Cloneable
接口而不提供实际实现的目的是避免子类从基本对象类调用clone
函数?实现Cloneable的唯一目的是允许克隆实现类的实例。正如文档中所说,“按照惯例,实现此接口的类应该使用公共方法覆盖Object.clone(受保护)。一种可能是使用反射或其他动态方式调用该方法。实现Cloneable
实际上没有意义。这是一个旧的设计(早在Java1.0时代),不幸的是,它没有成功,现在人们很好地理解它基本上已经被破坏了。从讨论其操作细节中可以获得一些见解,但作为一个实际问题,必须指出正确的答案是“不要使用Cloneable
”Cloneable
就是所谓的。今天,它可能会使用注释进行标记,但这些注释在Java中并不存在。Cloneable
是一个旧的标记接口。正确且非常简单的答案就是“不要使用它”。没有人知道。请参阅这些问题的好的、易于理解的答案,以及帮助您迁移、获取和浏览有效的Java。“具体地说,如果您对一个对象调用clone(),而该对象的类没有实现Clonable,JVM将在运行时抛出CloneNotSupportedException异常。”仅当该对象的clone()
方法以某种方式使用了Object.clone()
。如果类实现clone()
的方式不使用Object.clone()
,那么是否实现Cloneable
没有任何区别。“但您也可以创建一个新对象,将参数传递给构造函数。”这不会自动为子类创建正确的对象类。