gpt4 book ai didi

java - 使用 Java 8 在运行时选择具体实现

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:14 25 4
gpt4 key购买 nike

在选择要实例化的实现/子类时,我不清楚将 if/switch 放在哪里,特别是考虑到现在接口(interface)可以具有静态方法时。

假设我有一个服务,一个由接口(interface)定义的类型和几个实现。我想最好不要把那个逻辑放在服务中,而是要有工厂方法。但是它应该按照 this answer 中的建议进入接口(interface)或另一个带有参数到类型映射的类中吗? ?

将它放在界面中对我来说似乎很自然:

public interface MyInterface
{
public void doSomething();

public static MyInterface create(int param)
{
if (param == 0)
return new ImplA();
else
return new ImplB();
}
}

然后只需从服务中调用它:

public class MyService
{
public void serveMe(int param)
{
MyInterface.create(param).doSomething();
}
}

但我不知道让接口(interface)了解其实现或父类了解其子类型是否不好。所以

  1. 我应该把这个逻辑放在哪里?
  2. 如果我选择一个类型的子类,情况会发生很大变化吗?

最佳答案

为此使用Factory。这样您就可以保持单一职责原则。然而,在我自己的一个项目中,interface 定义了一种方法,用于确定应该使用该特定实现的参数类型。多亏了这一点和使用 Reflections,整个过程是自动化的。 Reflections 查找所有实现给定 interface 的类,并将其“使用类型”存储在映射中以便快速查找。多亏了这样的解决方案,如果开发人员需要新的实现,他所要做的就是创建它。系统的其他部分不需要其他修改,甚至在工厂类中也不需要。

Reflections 具有在编译时存储元数据的良好功能,因此在运行时查找适当的类只需眨眼

关于java - 使用 Java 8 在运行时选择具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29170469/

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