我正在从c++迁移到java的过程中,并认为自己是一个java新手。我最近查看了大量的代码库,其中有几个没有实现clone函数的public class Myclass implements Cloneable{...}示例。我不能理解这种模式的优点。有吗?如果您选择不实现clone函数,为什么要从Cloneable派生它?还有一些lombok anotations提供了一些默认的clone函数吗?
发布于 2016-12-08 04:49:12
如果类不实现Cloneable接口,则在该类的实例上调用clone将产生CloneNotSupportedException。java.lang.Object已经实现了一个clone方法(该方法不是抽象的),因此不需要子类来实现它。java.lang.Object的clone方法执行实例的浅层复制。
发布于 2016-12-08 05:16:35
如果你选择不实现克隆功能,为什么要从Cloneable派生它呢?
clone()方法不是从Cloneable接口派生的。
它来自Object类。
Cloneable只是一个标记接口。
如果在类的实例上调用clone()方法,则在运行时使用它来使行为有效。
Java选择了一个设计模型,默认情况下,对象拥有clone()方法。这是一个你可能喜欢或不喜欢的设计选择,但不管怎样,它是这样的
具体地说,如果您在一个对象上调用clone(),并且该对象的类没有实现Clonable,那么JVM将在运行时抛出一个CloneNotSupportedException异常。同样,如果某些类的某个方法未实现,则会抛出UnsupportedOperationException。
还有没有提供一些默认克隆函数的lombok?
默认情况下,clone()执行当前对象的浅层复制。也就是说,将为您要克隆的对象创建一个新实例,但不会克隆它拥有的所有对象字段。实际上,克隆对象的字段仍然引用与原始实例中相同的对象。仅具有原始类型(int、float、boolean等)的字段都是克隆的。
如果您需要在clone()方法中具有不同的行为,那么Lombok无法猜测您想要的行为。所以,不,使用它来生成clone()方法的实现是没有意义的。
发布于 2016-12-08 04:50:44
在lombok中实际上有一个@Wither注释:https://projectlombok.org/features/experimental/Wither.html
但您也可以只创建一个新对象,将参数传递给构造函数。
https://stackoverflow.com/questions/41027058
复制相似问题