首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不需要实现的Java Cloneable

不需要实现的Java Cloneable
EN

Stack Overflow用户
提问于 2016-12-08 04:45:50
回答 3查看 4.8K关注 0票数 3

我正在从c++迁移到java的过程中,并认为自己是一个java新手。我最近查看了大量的代码库,其中有几个没有实现clone函数的public class Myclass implements Cloneable{...}示例。我不能理解这种模式的优点。有吗?如果您选择不实现clone函数,为什么要从Cloneable派生它?还有一些lombok anotations提供了一些默认的clone函数吗?

EN

回答 3

Stack Overflow用户

发布于 2016-12-08 04:49:12

如果类不实现Cloneable接口,则在该类的实例上调用clone将产生CloneNotSupportedExceptionjava.lang.Object已经实现了一个clone方法(该方法不是抽象的),因此不需要子类来实现它。java.lang.Objectclone方法执行实例的浅层复制。

票数 1
EN

Stack Overflow用户

发布于 2016-12-08 05:16:35

如果你选择不实现克隆功能,为什么要从Cloneable派生它呢?

clone()方法不是从Cloneable接口派生的。

它来自Object类。

Cloneable只是一个标记接口。

如果在类的实例上调用clone()方法,则在运行时使用它来使行为有效。

Java选择了一个设计模型,默认情况下,对象拥有clone()方法。这是一个你可能喜欢或不喜欢的设计选择,但不管怎样,它是这样的

具体地说,如果您在一个对象上调用clone(),并且该对象的类没有实现Clonable,那么JVM将在运行时抛出一个CloneNotSupportedException异常。同样,如果某些类的某个方法未实现,则会抛出UnsupportedOperationException

还有没有提供一些默认克隆函数的lombok?

默认情况下,clone()执行当前对象的浅层复制。也就是说,将为您要克隆的对象创建一个新实例,但不会克隆它拥有的所有对象字段。实际上,克隆对象的字段仍然引用与原始实例中相同的对象。仅具有原始类型(intfloatboolean等)的字段都是克隆的。

如果您需要在clone()方法中具有不同的行为,那么Lombok无法猜测您想要的行为。所以,不,使用它来生成clone()方法的实现是没有意义的。

票数 1
EN

Stack Overflow用户

发布于 2016-12-08 04:50:44

在lombok中实际上有一个@Wither注释:https://projectlombok.org/features/experimental/Wither.html

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41027058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档