2

对不起,如果我的格式不好,第一次在 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
    }
}

有没有更简单的方法来做到这一点?

4

3 回答 3

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 {
    ...
}

它是一个标记接口,因此您不需要实现任何方法。

于 2013-10-29T06:51:24.087 回答
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;
}
于 2013-10-29T07:01:36.283 回答
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;
}

您需要处理异常。

于 2013-10-29T06:57:24.270 回答