Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 clazz.clone的新clazz(此)是否存在风险?_Java_Clone - Fatal编程技术网

Java clazz.clone的新clazz(此)是否存在风险?

Java clazz.clone的新clazz(此)是否存在风险?,java,clone,Java,Clone,在构建中断后,一位开发人员抱怨说,这是因为以前可用的Clazz.clone()(不是类的真实名称:)已被删除,因此他对clz.clone()的调用正在中断 之后,claz的作者建议将客户端代码更改为使用newclazz(clz)\ 执行clone方法返回new Clazz(this)是否存在风险?会出什么问题?我不认为这样做有风险,但这是不必要的。让你的一个开发者改变他的函数调用 // this is the same var myClazz = thatClazz.clone(); // a

在构建中断后,一位开发人员抱怨说,这是因为以前可用的
Clazz.clone()
(不是类的真实名称:)已被删除,因此他对
clz.clone()
的调用正在中断

之后,
claz
的作者建议将客户端代码更改为使用
newclazz(clz)
\


执行
clone
方法返回
new Clazz(this)
是否存在风险?会出什么问题?

我不认为这样做有风险,但这是不必要的。让你的一个开发者改变他的函数调用

// this is the same
var myClazz = thatClazz.clone();

// as this
var myClazz = new Clazz(thatClazz);
新方法使用了一种叫做复制构造函数的东西,在我看来,它比使用.clone()看起来更干净


此外,应该与您的开发团队讨论如何修改其他模块依赖的代码。任何非私有的方法或属性在更改之前都应该检查引用。

我不认为这样做有风险,但这是不必要的。让你的一个开发者改变他的函数调用

// this is the same
var myClazz = thatClazz.clone();

// as this
var myClazz = new Clazz(thatClazz);
新方法使用了一种叫做复制构造函数的东西,在我看来,它比使用.clone()看起来更干净


此外,应该与您的开发团队讨论如何修改其他模块依赖的代码。任何非私有的方法或属性在更改之前都应该检查引用。

主要区别在于克隆是一个方法,构造函数是一个构造函数

这意味着

Clazz x = ...; 
Object xClone = x.clone()
返回x.getClass()克隆返回的任何方法:Clazz对象或Clazz子类的对象。将此与

Clazz x = ...;
Object xCopy = new Clazz( x );
这将为您提供一个Clazz对象,即使x引用子类扩展Clazz


大概这对“Clazz的作者”来说并不重要。

主要区别在于克隆是一种方法,构造函数是一种构造函数

这意味着

Clazz x = ...; 
Object xClone = x.clone()
返回x.getClass()克隆返回的任何方法:Clazz对象或Clazz子类的对象。将此与

Clazz x = ...;
Object xCopy = new Clazz( x );
这将为您提供一个Clazz对象,即使x引用子类扩展Clazz


据推测,这对“Clazz的作者”来说并不重要。

互联网上有很多关于克隆与复制构造函数的讨论,例如

添加克隆方法会起作用,但既然这都是内部代码,为什么还要引入额外的复杂性呢

听起来你可以用一个过程来处理破坏性的变化。可能只是做一些简单的事情,比如将克隆标记为不推荐使用一段时间,让开发人员有机会停止使用它


我看到人们浪费了数小时试图在内部API上保持向后兼容性,而更多的时间在争论像这样的琐碎更改。

互联网上有很多关于克隆与复制构造函数的讨论,例如

添加克隆方法会起作用,但既然这都是内部代码,为什么还要引入额外的复杂性呢

听起来你可以用一个过程来处理破坏性的变化。可能只是做一些简单的事情,比如将克隆标记为不推荐使用一段时间,让开发人员有机会停止使用它


我曾看到人们花费数小时试图在内部API上保持向后兼容性,并花费更多时间争论像这样的琐碎更改。

@DmitryGinzburg如果
Clazz
var
的子类型,那么它就是Java,不是吗?这是真的,但我认为它仍然解决了问题的各个方面。clone()的好处在于它是多态的,复制构造函数不是@DmitryGinzburg如果
Clazz
var
的子类型,那么它就是Java,不是吗?这是真的,但我认为它仍然解决了问题的要素。clone()的好处是它是多态的,而copy构造函数不是!有很多情况下,
newclazz(x)
应该/不应该/返回子类,但却失败了。切片并不总是好的。现在我知道你不是。由于我特别要求在使用clone时存在风险,我可能误解了您对方法调用和构造函数调用之间的区别的描述,以暗示一些好处/损失分析有很多情况下,
new Clazz(x)
应该/不应该/返回子类,而是失败。切片并不总是好的。现在我知道你不是。由于我是专门询问使用克隆的风险,我可能误解了您对方法调用和构造函数调用之间的区别的描述,从而暗示了一些收益/损失分析