Java初始化子类

时间:2013-01-02 17:18:37

标签: java instantiation subclass

初始化接口的实现类(由某些逻辑确定)的适当方法是什么

实施例

IAnaimal is an interface
Cat -> IAnimal
Dog -> IAnimal
Cow -> IAnimal


int x = in.nextInt();
IAnimal animal = null;

if(x==1)
 animal = new Dog();
else if(x==2)
 animal = new Cat();
else
 animal = new Cow();

animal.destroyManKind();

这是正确的做法吗?是否有更“专业”的做法?

5 个答案:

答案 0 :(得分:4)

我会更清楚地读取名称而不是1,2和3,但在这种情况下你可以使用开关。

int choice = in.nextInt();

switch(choice) {
  case 1: animal = new Dog(); break;
  case 2: animal = new Cat(); break;
  default: animal = new Cow(); break;
}

或使用字符串开关

String choice = in.next();

switch(choice.toLowerCase()) {
  case "dog": animal = new Dog(); break;
  case "cat": animal = new Cat(); break;
  case "cow": animal = new Cow(); break;
  default: // error
}

答案 1 :(得分:3)

你的行为方式没有错。您还可以查看Factory design pattern

答案 2 :(得分:1)

假设他们有一个共同的超类Animal,它可以有一个带有int的静态构建器方法,你可以这样做

IAnimal animal = Animal.build(x);

其中

public class Animal{
public static IAnimal build(int x){

 if(x==1) return new Dog();
 else if(x==2) return new Cat();

 return new Cow();
}}

答案 3 :(得分:1)

    switch (x){
      case 1: 
       animal = new Dog();
       break;
      case 2:
       animal = new Cat();
       break;
      default
       animal = new Cow();
    }

您确定Cow是有用的默认设置吗?

答案 4 :(得分:0)

我更喜欢动物阵列

IAnimal animal = null;

IAnimal [] animals ={null,new Dog(),new Cat(),new Cow()};

animal = animals[x]