我读过你可以使用类对象而不是使用原型进行克隆。但我不明白使用类对象而不是那个意味着什么?如果有人理解使用类对象而不是原型模式意味着什么,那么任何人都可以举个例子吗?
答案 0 :(得分:1)
从Java 5开始,java.lang.Class
在其自身类型上是通用的。这允许类以类型安全的方式创建其实例。
当您使用克隆原型时,您可以执行以下操作:
interface Calculator {
void setA(int a);
void setB(int b);
int compute();
Calculator copy();
}
class Adder implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a+b;}
public Calculator copy() {
Adder res = new Adder();
res.a = a;
res.b = b;
return res;
}
}
class Multiplier implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a*b;}
public Calculator copy() {
Multiplier res = new Multiplier();
res.a = a;
res.b = b;
return res;
}
}
class Test {
static void computeWithPrototype(Calculator proto) {
Calculator calc = proto.copy();
calc.setA(123);
calc.setB(321);
System.out.println(calc.compute());
}
public static void main(String[] args) throws Exception {
computeWithPrototype(new Adder());
computeWithPrototype(new Multiplier());
}
}
Demo of the above approach on ideone
您可以使用Class<T>
而不是copy
方法重新编写它,如下所示:
interface Calculator {
void setA(int a);
void setB(int b);
int compute();
}
class Adder implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a+b;}
}
class Multiplier implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a*b;}
}
class Test {
static <T extends Calculator> void computeWithClass(Class<T> calcClass)
throws Exception {
Calculator calc = calcClass.newInstance();
calc.setA(123);
calc.setB(321);
System.out.println(calc.compute());
}
public static void main(String[] args) throws Exception {
computeWithClass(Adder.class);
computeWithClass(Multiplier.class);
}
}
答案 1 :(得分:0)
在java中创建对象时,它有一个引用内存。因此,当您尝试将该对象分配给变量时,您将传递参考内存。
示例:
Person a = new Person(); a.setName("Person abc");
Person b = a; b.setName("Person yzw");
System.out.print(a.getName());
System.out.print(b.getName());
因此,当您修改属于此内存引用的属性时,您可以修改它们。 打印:“yzw yzw”;
因此,如果您不希望它发生,请使用Cloneable接口:
public class Person implements Cloneable{
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
因此,当您调用clone()方法时,您将拥有两个不同的对象。 例如:
Person a = new Person();
a.setName("Person abc");
Person b = (Person)a.clone();
System.out.print(a.getName());
System.out.print(b.getName());
打印:“abc yzw”;