gpt4 book ai didi

java - 如何基于某个类实例化具体的实现?

转载 作者:行者123 更新时间:2023-12-01 15:12:43 26 4
gpt4 key购买 nike

我有几个扩展 bean 的对象:

public class Fruit {}

public class Banana extends Fruit {}

public class Pear extends Fruit {}

我有一个具有不同实现的接口(interface),每个 bean 都有一个实现。

public interface Milkshake {
public String doMilkshake();
}

public class FruitMilkshake implements Milkshake {
public String doMilkshake() {
return "Fruit Milkshake!";
}
}

public class BananaMilkshake implements Milkshake {
public String doMilkshake() {
return "Banana Milkshake!";
}
}

public class PearMilkshake implements Milkshake {
public String doMilkshake() {
return "Pear Milkshake!";
}
}

如何根据 bean 的具体类型实例化正确的实现?

现在我已经使用了类型化和 Map 来“映射”正确的实现。像这样:

public void hungry(Fruit fruit) {
Map<String, String> obj2impl = new HashMap<String, String>();
obj2impl.put("Fruit", "FruitMilkshake");
obj2impl.put("Banana", "BananaMilkshake");
obj2impl.put("Pear", "PearMilkshake");

String name = fruit.getClass().getCanonicalName();
String implName = obj2impl.get(name);
Milkshake milkshake = (Milkshake) Class.forName(implName).newInstance();

milkshake.doMilkshake(fruit);
}



public interface Milkshake <T t> {
public String doMilkshake(T t);
}

public class FruitMilkshake implements Milkshake<Fruit> {
public String doMilkshake(Fruit fruit) {
return "Fruit Milkshake!";
}
}

public class BananaMilkshake implements Milkshake<Banana> {
public String doMilkshake(Banana banana) {
return "Banana Milkshake!";
}
}

public class PearMilkshake implements Milkshake<Pear> {
public String doMilkshake(Pear pear) {
return "Pear Milkshake!";
}
}

实现这一目标的更好方法?

最佳答案

Better ways to achieve this?

首先是避免反射(reflect)类的名称:

Map<String, Class<? extends Milkshake>> obj2impl =
new HashMap<String, Class<? extends Milkshake>>();
obj2impl.put("Fruit", FruitMilkshake.class);
obj2impl.put("Banana", BananaMilkshake.class);

...

Milkshake milkshake = obj2impl.get(text).newInstance();

现在仍然要求您在每个实现中都有一个无参数构造函数,并且它仍然总是创建一个新实例。如果您使用 Provider -类似的概念,你可以绕过这个:

Map<String, Provider<Milkshake>> map = ...;
// Fill the map with providers, some of which could create a new instance,
// and some could reuse an existing one

...

Milkshake milkshake = map.get(text).get();

编辑:重读这篇文章后,您也可以删除文本部分,并得到 Map<Class<?>, Provider<Milkshake>> 。如果可能的话,避免对类的名称进行硬编码。

当然,如果你的Fruit类(class)有一个makeMilkshake抽象方法,那就更好了...

关于java - 如何基于某个类实例化具体的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12104864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com