根据用户输入选择子类?

时间:2015-12-21 12:21:43

标签: java class if-statement initialization

我试图根据用户输入选择一个特定的子类,但我不太清楚如何做到这一点。例如:

System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();

if(input == 1){
     Cat newPet = new Cat();
}
else{
    Dog newPet = new Dog();
}

这只是我刚才创建的一个简单示例,因此可以解释任何语法错误。我理解,一旦if语句结束,newPet对象就超出了范围,因此之后就不能再使用它了。我也尝试了一些案例,但这不起作用,因为我宣布newPet两次,即使每次运行程序只能访问一个。

根据用户输入,程序中的更多不同因素会受到影响。我总是可以在每个不同的因素中使用if语句,但是想知道是否有更简洁的方法来执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以创建一个界面,Animal。 猫与狗应该实施动物。 您的代码可以更改为

System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();
Animal pet=null;
if(input == 1){
     pet = new Cat();
}
else{
    pet = new Dog();
}

这也有助于保持更清洁的方法。

答案 1 :(得分:0)

你需要

    创建宠物实例的
  • 工厂(在Java 8中:Supplier<Pet>
  • 输入值与工厂之间的映射
  • 一个策略如果没有提供有效输入则返回什么(如果没有为输入值映射工厂,则可能是一个抛出异常的检查,或者返回默认宠物的默认工厂或空)。

代码:

Map<Integer, Supplier<Pet>> factories = new HashMap<>();
factories.put(1, Cat::new);
factories.put(2, Dog::new);

Supplier<Pet> defaultPetSupplier = () -> null;
Function<Integer, Pet> f = i -> factories.getOrDefault(i, defaultPetSupplier).get();

System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();

Pet pet = f.apply(input);

答案 2 :(得分:0)

如果你想避免输入类型,那么你必须做更多的工作。但是你仍然必须使用多态概念。 创建一个名为Pet的接口,并将Pet接口中Cat和Dog类包含的所有方法包含为abstact方法。

class Cat {
    public void catMethod1() {
    }

    public void catMethod2() {
    }
}

class Dog {
    public void dogMethod() {
    }
}

interface Pet {
    public void catMethod1();

    public void catMethod2();

    public void dogMethod();
}

class HelperClass implements Pet {
    Cat cat;
    Dog dog;

    public HelperClass(int input) {
        if (input == 1) {
            cat = new Cat();
        } else {
            dog = new Dog();
        }
    }

    @Override
    public void dogMethod() {

        if (dog == null) {
            return;
        }
        dog.dogMethod();
    }

    @Override
    public void catMethod1() {
        if (cat == null) {
            return;
        }
        cat.catMethod1();

    }

    @Override
    public void catMethod2() {
        if (cat == null) {
            return;
        }
        cat.catMethod2();

    }

}

现在您可以访问没有类型转换的方法。

Pet newpet = new HelperClass(输入);

<强> newpet.catMethod2();