有没有办法强制方法使用子类构造函数而不使用instanceof?

时间:2013-10-29 06:49:10

标签: java

对不起,如果我的格式化不好,第一次使用StackOverflow。 我有一个FruitBuilder类用于一组相同类型的对象,它们都是Fruit类的扩展,FruitBuilder包含一组看起来像这样的变量:

public Apple redApple = new Apple(size, color, price);
public Orange bigOrange = new Orange(size, color, price);
public Pear greenPear = new Pear(size, color, price);

我有一个名为makeFruit的复制方法,它创建一个新的水果并将其添加到ArrayList水果中,如下所示:

public Fruit makeFruit(Fruit f){
    Fruit fruit = new Fruit(f.size, f.color, f.price);
    fruits.add(fruit);
    return fruit;
}

这样可以正常工作,除了它创建一个新的Fruit而不是所需的子类,我可以通过使用一系列instanceof检查然后根据具体情况强制子类来使其工作:

public Fruit makeFruit(Fruit f){    
 if (f instanceof Apple){
        Apple apple = new Apple(f.size, f.color, f.price);
        fruits.add(apple);
        return apple;
        //snip
    }
}

有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

使用clone() - 它专为此目的而设计:

public Fruit makeFruit(Fruit f) {
    Fruit fruit = (Fruit)f.clone();
    fruits.add(fruit);
    return fruit;
}

有几种方法可以使clone()适用于您的课程。最简单的方法是Fruit实施Cloneable

public class Fruit implements Cloneable {
    ...
}

这是marker interface,因此您无需实施任何方法。

答案 1 :(得分:2)

您可以在Fruit类

中创建一个抽象方法
public abstract Fruit copy()

然后在每个子类中添加一个具体的实现,例如:对于Apple类:

@Override
public Apple copy(){
    Apple apple = new Apple(this.size, this.color, this.price);
    fruits.add(apple);
    return apple;
}

答案 2 :(得分:1)

您可以使用反射:

public Fruit makeFruit(Fruit f)
{
    Fruit fruit = f.getClass()
                   .getConstructor(int.class, int.class, int.class)
                   .newInstance(f.size, f.color, f.price);
    fruits.add(fruit);
    return fruit;
}

您需要处理例外情况。