我读到您可以使用类对象而不是使用带有克隆的原型。但是我不明白使用类对象代替它意味着什么?如果有人理解使用类对象而不是原型模式意味着什么,谁能举个例子?
问问题
105 次
2 回答
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());
}
}
Class<T>
您可以使用 a而不是方法重写它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);
}
}
于 2013-10-10T18:15:40.300 回答
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”;
于 2013-10-10T18:12:16.347 回答