2

私のフォーマットが良くない場合は申し訳ありませんが、初めて StackOverflow を使用します。FruitBuilder クラスのすべての拡張機能である同じ型のオブジェクトのセットの FruitBuilder クラスがあります。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);

新しい果物を作成し、それを ArrayList の果物に追加する makeFruit というコピー メソッドがあり、次のようになります。

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 に答える
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 に答える