Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可克隆,无需实现 我正在从C++迁移到java,并把自己看作java NoOB。我最近一直在研究一个庞大的代码库,其中有几个示例是公共类Myclass实现了可克隆的{…},而没有实现克隆函数。我不理解这种模式的优点。有吗?如果选择不实现clone功能,为什么要从Cloneable派生它?还有任何lombok Anotation提供了一些默认的clone函数吗?_Java_Design Patterns_Cloneable - Fatal编程技术网

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
没有任何区别。“但您也可以创建一个新对象,将参数传递给构造函数。”这不会自动为子类创建正确的对象类。