Java 获取不带if-else或反射或开关case的子类实例

Java 获取不带if-else或反射或开关case的子类实例,java,polymorphism,Java,Polymorphism,嗨,我有一个抽象的超级类水果和一些子类苹果,橙色 abstract class Fruit { public abstract String getFruitName(); public static Fruit getInstance(String fruitName) {} } class Apple extends Fruit { public String getFruitName() {return "Apple";} } 其他水果子类与苹果相同。我想实现水果的getI

嗨,我有一个抽象的超级类水果和一些子类苹果,橙色

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

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

其他水果子类与苹果相同。我想实现水果的getInstance方法,例如,对于参数“Apple”,它返回一个Apple对象。但我不想使用反射,也不想用if-else或switch-case来检查它。我如何才能做到这一点?

如果您使用java 7+,请使用水果名称开关查看您应该查看的内容

这是一种干净的方法,易于维护并生成可读代码。添加或删除
水果
也很简单,只需删除类并将其从
水果工厂
hashmap中删除即可

创建一个接口:Fruit

 public interface Fruit {
    void getFruitName();
 }
创建一个工厂,根据您的
值返回正确的水果。现在,您可以使用以下命令,而不是
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);
   }

}

EDIT:我看到接口名
Fruit
与抽象类
Fruit
冲突。您可以使用任何名称,我只是在解释这个想法。

为什么需要子类?对于这种特定(可能是简化的?)情况,FROUTNAME可能只是非抽象类FROUT中的一个变量。实际上,我的程序的可能副本比我在这里编写的代码更复杂。在我的程序中,我真的无法做到@fhissenaswitch语句与if-else语句相同。我还想要点别的,谢谢!这就是我所需要的如果需要将参数传递到构造函数中,如何使用这里建议的技术?例如,使用
贴图的技术。您是否必须构造默认对象,然后将参数传递到
newInstance
方法中,以使用参数实例化
对象
public class Apple implements Fruit {

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