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

Java 有没有办法强迫方法使用子类构造函数而不使用instanceof?,java,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

抱歉,如果我的格式设置不好,第一次使用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);
public Fruit makeFruit(Fruit f){
    Fruit fruit = new Fruit(f.size, f.color, f.price);
    fruits.add(fruit);
    return fruit;
}
我有一个名为Makefuit的复制方法,它创建一个新的水果并将其添加到ArrayList水果中,如下所示:

public Apple redApple = new Apple(size, color, price);
public Orange bigOrange = new Orange(size, color, price);
public Pear greenPear = new Pear(size, color, price);
public Fruit makeFruit(Fruit f){
    Fruit fruit = new Fruit(f.size, f.color, f.price);
    fruits.add(fruit);
    return 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
    }
}
有更简单的方法吗?

使用——它正是为了这个目的而设计的:

public Fruit makeFruit(Fruit f) {
    Fruit fruit = (Fruit)f.clone();
    fruits.add(fruit);
    return fruit;
}
有几种方法可以使
clone()
适用于您的类。最简单的方法是使
水果
实现:


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

您可以使用反射:

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;
}

您需要处理异常。

您可以在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;
}

您似乎正在使用一个类作为一个类型,在这个类型中,您可以有一个像
enum type{Apple,Orange,Pear}这样的属性
并且只有一个字段,只有一个
水果
类。这是因为每个子类都有不同的方法覆盖超类。我怀疑它们也可以基于属性。您的所有方法都覆盖了具体类中的超类方法吗?因为如果您的具体类中没有任何独特的方法,那么您应该使用@Peter建议的
enum
。是的,每个子类在1000行主类上大约有200行代码,我只使用了Fruits作为示例。为什么要让它使用您正在复制的
Fruit
?您可以只使用一个不带参数的
copy()
方法,这样您就可以执行
fruits.add(apple.copy())
。毕竟,在您的示例中,它是一个实例方法。一个有效点。如果是类方法,则需要参数,在本例中,最好只复制实例值。我会更新这个例子。这可能对我有用,听起来是解决我问题的最好办法。谢谢。没问题,谢谢布赖恩的改进。我刚刚想到,抽象方法不应该以;或者我做错了什么?不抱歉,我忘了说我需要浅拷贝而不是深拷贝,克隆不行。无论如何,谢谢:)
clone()
返回
Object
,您需要强制转换它。clone不是深度复制,它有几个缺陷。听起来不错,我可能会使用另一个答案中建议的copy()方法,所以我不必处理不同的构造函数,但我会在将来记住这一点。非常感谢。