使用Java类对象而不是原型?

时间:2013-10-10 17:53:13

标签: java class object prototype clone

我读过你可以使用类对象而不是使用原型进行克隆。但我不明白使用类对象而不是那个意味着什么?如果有人理解使用类对象而不是原型模式意味着什么,那么任何人都可以举个例子吗?

2 个答案:

答案 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);
    }
}

Demo of the second approach on ideone.

答案 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”;