我试图创建一个对象的浅拷贝(新实例),而无需手动设置每个字段.这个对象不是我有能力修改的类型,所以我不能进入该对象并实现ICloneable ......我有点卡住了.有一种简单的方法可以简单地克隆一个对象,还是我必须实现一些只是将每个字段复制到一个新对象的Clone()方法?
在此先感谢您的帮助!
我正在阅读Joshua Bloch的Effective Java.在那里,他谈到不使用Clonable界面.我有点像菜鸟,所以我的问题是,什么是代码中需要克隆的用例?有人能给出一个粘性的例子,以便我能掌握这个概念吗?
我有一个通用类,需要能够克隆参数类型的对象.下面是一个非常简单的例子.编译器声称来自Object类型的clone()不可见.
public class GenericTest<T extends Cloneable>
{
T obj;
GenericTest(T t)
{
obj = t;
}
T getClone()
{
// "The method clone() from the type Object is not visible."
return (T) obj.clone();
}
}
Run Code Online (Sandbox Code Playgroud)
我宁愿不让调用者进行克隆,因为还有其他事情必须发生以维护对象的完整性.上面的代码只是问题的一个例子,没有我必须维护的与克隆对象相关的其他数据的噪音.
有没有办法绕过这个或者这是Java设计师考虑合理化其缺点的另一个例子,相当于没有?
I was reading this answer and he mentioned a link, where author explains why shouldn't we use Cloneable. But, still have doubt what was stated there
如果我有一个 Cloneable 数组,您会认为我可以运行该数组并克隆每个元素以制作该数组的深层副本,但我不能。您不能将某些内容强制转换为 Cloneable 并调用克隆方法,因为 Cloneable 没有公共克隆方法,而 Object 也没有。如果您尝试转换为 Cloneable 并调用克隆方法,编译器会说您正在尝试调用对象上受保护的克隆方法。
但是,我在这里做到了
Init s = Init.getInstance(); // getting instance
int count=0;
Cloneable[] v = new Cloneable[5]; // creating array
Init x = s;
Init y = new Init(s);
try {
while (count < 5) {
v[count++] = (Cloneable) s.clone(); // casting …Run Code Online (Sandbox Code Playgroud) 嘿我实际上是在Java上使用自定义Vector类,
public class Vector {
private double X;
private double Y;
public Vector(double x, double y) {
this.X = x;
this.Y = y;
}
public void setX(double x) {
this.X = x;
}
public double getX(double x) {
return this.X;
}
public void setY(double y) {
this.Y = y;
}
public double getY(double y) {
return this.Y;
}
}
Run Code Online (Sandbox Code Playgroud)
我想添加multiply()方法,该方法将按照指定的因子返回此向量*,
public void multiply(double factor) {
this.X *= factor;
this.Y *= factor;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用需要矢量的函数时,我想像它一样使用它
doSomething(ancientVector.multiply(-1D));
Run Code Online (Sandbox Code Playgroud)
但是jvm不满意,因为我发送给函数的arg是void...
我怎么能做到干净,我应该实现Cloneable或创建另一个构造函数的方式 …
对于序列化,将排除瞬态字段.克隆有没有类似的关键词?如何从克隆中排除字段?
public class Foo implements Cloneable {
private Integer notInClone;
}
Run Code Online (Sandbox Code Playgroud) 制作一个不可变对象是个坏主意Cloneable.这就是为什么 String不能克隆.不可变BigInteger并且BigDecimal也没有 Cloneable.
但是无法克隆可变的StringBuilder和StringBuffer!
这种决定背后的原因是什么?
是的,我可以使用"复制构造函数",new StringBuilder(CharSequence seq)但提供复制构造函数和禁止克隆的设计原则/推理是什么?
clone我已经看到了必须在类中实现方法的问题的解决方案(包括在本网站中) ,因此return即使我们只有该类,它也是自身的堆分配克隆Base。
当你必须在很多类中一次又一次地实现相同的方法时,问题就出现了,我记得当你只需要从模板类继承(命名它)时,Cloneable它就实现了它,但是我尝试这样做的方式不起作用:
template<typename T, typename B> class Cloneable{
public:
B* clone(){return new T(*this);}
};
class Bottom {
public:
virtual void sayhi() = 0;
virtual Bottom* clone() = 0;
};
class Middle: public Cloneable<Middle, Bottom>, public Bottom {
public:
void sayhi() override {cout << "Hi from the Middle" << endl;}
};
//class Top: public Middle ...?
int main() {
Bottom* b1 = new Middle();
b1->sayhi();
delete b1;
}
Run Code Online (Sandbox Code Playgroud)
我记得向我展示这一点的人实际上只用了一个参数就做到了Cloneable,但无论如何,我会感谢你能想象到的任何方式来做到这一点。
我不明白为什么我们不能做到以下几点:
interface MyInterface extends Cloneable {}
class myClazz implements MyInterface {
public Object clone() { return null; }
}
class test{
public static void main(String[]a){
MyInterface o = new myClazz();
o.clone(); // IMPOSSIBLE
}
}
Run Code Online (Sandbox Code Playgroud)
但这样做会很好
interface Misc{
public void testM();
}
interface MyInterface extends Misc{}
class myClazz implements MyInterface {
public void testM() {}
}
class test{
public static void main(String[]a){
MyInterface o = new myClazz();
o.testM(); // OK
}
}
Run Code Online (Sandbox Code Playgroud)
Cloneable会发生什么?
谢谢,
有一些 Android 应用程序允许用户克隆手机上现有的应用程序。例如:http : //fixoptimize.com/app-cloner 你能解释一下这些克隆器是如何工作的吗?谢谢你。
cloneable ×10
java ×7
clone ×4
android ×1
c# ×1
c++ ×1
cloning ×1
constructor ×1
generics ×1
inheritance ×1
object ×1
stringbuffer ×1
templates ×1