你能解释一下为什么我应该继承ICloneable
并实现这个Clone()
方法吗?
如果我想做一个深层复制,我不能只实现我的方法吗?我们说吧MyClone()
?
我为什么要继承ICloneable
?有什么好处?这只是让代码"更具可读性"的问题吗?
我需要在我的一个没有超类的对象中实现深度克隆.
处理CloneNotSupportedException
超类抛出的检查的最佳方法是什么(是Object
)?
一位同事建议我按以下方式处理:
@Override
public MyObject clone()
{
MyObject foo;
try
{
foo = (MyObject) super.clone();
}
catch (CloneNotSupportedException e)
{
throw new Error();
}
// Deep clone member fields here
return foo;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一个很好的解决方案,但我想把它扔到StackOverflow社区,看看是否还有其他任何我可以包含的见解.谢谢!
我正在寻找一些解释Java的教程Cloneable
,但没有得到任何好的链接,而且Stack Overflow正变得越来越明显.
我想知道以下内容:
Cloneable
意味着我们可以通过实现Cloneable
接口来获得克隆或对象的副本.这样做的优点和缺点是什么? 以下编译正常:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)
但这不是:
String s = new String();
System.out.println(s instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)
抛出编译器错误.
问题是什么?
题:
package GoodQuestions;
public class MyClass {
MyClass() throws CloneNotSupportedException {
try {
throw new CloneNotSupportedException();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyClass obj = new MyClass();
MyClass obj3 = (MyClass)obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里的类'MyClass'可以通过调用'Object'类中的clone方法来克隆自己的对象.当我尝试在同一个包'GoodQuestions'中的另一个类('TestSingleTon')中克隆这个类('MyClass')时,它会抛出以下编译时错误.
'Object类型的方法clone()不可见 '
所以这是抛出上述错误的代码?
package GoodQuestions;
public class TestSingleTon {
public static void main(String[] args) {
MyClass obj = new MyClass();
MyClass obj3 = obj.clone(); ---> here is the compile error. …
Run Code Online (Sandbox Code Playgroud) 为什么界面中没有.clone()
指定方法java.lang.Cloneable
?
我编写了一个程序,它具有特征Animal
和Dog
实现特征的结构.它还有一个AnimalHouse
存储动物作为特征对象的结构Box<Animal>
.
trait Animal {
fn speak(&self);
}
struct Dog {
name: String,
}
impl Dog {
fn new(name: &str) -> Dog {
return Dog {
name: name.to_string(),
};
}
}
impl Animal for Dog {
fn speak(&self) {
println!{"{}: ruff, ruff!", self.name};
}
}
struct AnimalHouse {
animal: Box<Animal>,
}
fn main() {
let house = AnimalHouse {
animal: Box::new(Dog::new("Bobby")),
};
house.animal.speak();
}
Run Code Online (Sandbox Code Playgroud)
它返回"Bobby:ruff,ruff!" 正如所料,但如果我尝试克隆house
编译器返回错误:
fn main() {
let house …
Run Code Online (Sandbox Code Playgroud) 我遇到了一些实现的类代码,Clonable
文档说明:
类实现了Cloneable接口,以向Object.clone()方法指示该方法合法地为该类的实例制作字段的字段副本.在未实现Cloneable接口的实例上调用Object的clone方法会导致抛出异常CloneNotSupportedException.按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护).有关重写此方法的详细信息,请参阅Object.clone().请注意,此接口不包含克隆方法.因此,仅仅通过实现该接口的事实来克隆对象是不可能的.即使反射调用clone方法,也无法保证它会成功.
我无法理解实现这个类的重点,正如文档中所述,该.clone
方法没有在接口中实现,我必须实现它.那么为什么要使用这门课?为什么我不在copyClass
我的类中编写一个方法来制作对象副本而不执行这个类?
提前致谢.
请考虑以下有效Java项目11(明智地覆盖克隆),其中Josh Bloch正在解释clone()
合同的错误.
这份合同存在许多问题."没有被称为构造函数"的规定过于强烈.一个行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象.如果类是final,clone甚至可以返回由构造函数创建的对象.
有人可以解释Josh Bloch在第一段中所说的"如果类是final
,clone
甚至可以返回由构造函数创建的对象".这里final
有什么关系clone()
?
cloneable ×10
java ×8
clone ×5
.net ×1
c# ×1
cloning ×1
deprecated ×1
icloneable ×1
instanceof ×1
java-8 ×1
methods ×1
rust ×1
struct ×1
traits ×1