获取没有if else或者反射或switch-case的子类实例

时间:2015-07-28 05:21:45

标签: java polymorphism

嗨我有一个抽象的超级水果和一些子类Apple,Orange,......

abstract class Fruit {
  public abstract String getFruitName();
  public static Fruit getInstance(String fruitName) {}
}

class Apple extends Fruit {
  public String getFruitName() {return "Apple";}
}

其他Fruit子类与Apple相同。我想实现Fruit的getInstance方法,以便例如参数" Apple"它返回一个Apple对象。但我不想使用反射,我不想通过if-else或switch-case来检查它。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

如果您使用java 7 +

,请使用水果名称开关

答案 2 :(得分:0)

你应该看看Factory Pattern

这是一种干净的方法,易于维护并产生可读代码。添加或删除Fruit也很简单,只需删除该类并将其从FruitFactory hashmap中删除。

创建一个界面:水果

 public interface Fruit {
    void getFruitName();
 }

创建一个工厂,根据您的value返回正确的水果。现在,您只需使用以下内容代替if-else

  Fruit fruit = FruitFactory.getFruit(value);
  fruit.getFruitName();

编写FilterFactory的一种常用方法是在其中使用HashMap

public class FilterFactory{
   static HashMap<String, Fruit> fruitMap;
   static{
       fruitMap = new HashMap<>();
       fruitMap.put("apple",new Apple());
       ...
   }
   // this function will change depending on your needs
   public Filter getFruit(int value){
       return fruitMap.get(value);
   }

}

创建你的三个(在你的情况下)像这样的水果:(虽然名字有意义)

public class Apple implements Fruit {

    public void getFruitName(){
      //do something
    }
}

编辑:我看到界面名称Fruit与您的抽象类Fruit发生冲突。您可以使用任何名称,我只是在解释这个想法。