如何确定要创建的子类?

时间:2014-11-29 08:27:52

标签: java

通常,我们可以检查输入以确定在构造函数外部创建哪个子类。

在这个例子中,我们在main函数中检查它:

class Fruit 
{
    String name;
    Fruit(String name) 
    {
        this.name = name;
    }
}

class Apple extends Fruit 
{
    Apple(String name) 
    {
        super(name);
    }
}

class Orange extends Fruit 
{
    Orange(String name) 
    {
        super(name);
    }
}

public static void main(String[] args) 
{
    String input = ""; // apple or orange
    if(input.equals("Apple"))
        Fruit f = new Apple("apple");   
    else if (input.equals("Orange"))
        Fruit f = new Orange("orange");
}

我们如何在构造函数中检查它是否具有新的特定子类?

public static void main(String[] args) 
{
    Fruit f = new Fruit("apple");
}

abstract class Fruit 
{
    String name;
    Fruit(String name) 
    {
        if(name.equals("Apple"))
            this = new Apple("apple");  
        else if (name.equals("Orange"))
            this = new Orange("orange");
    }
}

2 个答案:

答案 0 :(得分:3)

首先,不要使用==进行字符串比较。使用equals

其次,您无法在超类的构造函数中决定要创建实例的子类。当你调用new Fruit(...)时,你创建了一个超类的实例,它不会在你的情况下通过编译,因为Fruit是抽象的。即使它不抽象,也不能为this分配任何内容。您无法更改要实例化的类的类型。

答案 1 :(得分:1)

我当晚正在读一本名为Effective Java的书,并讨论了这类问题。您可能想要了解的是Factory method pattern。为此,您可能会遇到以下情况:

public class Fruit {
    ...
    public static Fruit createFruit(String name) {
        if(name.equalsIgnoreCase("apple"))
            return new Apple();
        if(name.equalsIgnoreCase("orange"))
            return new Orange();
        ...
        return new Fruit(name);
    }
    ...
}

然后,在创建新水果时,请改用:

Fruit apple = Fruit.createFruit("apple"); //returns an apple instance
Fruit orange = Fruit.createFruit("orange"); //returns an orange instance
Fruit fruit = Fruit.createFruit("watermelon"); //returns a basic fruit instance with watermelon as the name

编辑:更改了命名方案以反映工厂方法的真实用途;感谢Bartlomiej Lewandowski。