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

use*_*908 11 java inheritance interface-implementation

我不清楚在选择要实例化的实现/子类时放置if/的位置switch,特别是考虑到现在接口可以有静态方法.

假设我有一个服务,一个由接口和几个实现定义的类型.我想最好不要把这个逻辑放在服务中,而是要有工厂方法.但是它应该在界面中还是在另一个类中使用此答案中建议的param-to-type映射?

把它放在界面中似乎很自然:

public interface MyInterface
{
    public void doSomething();

    public static MyInterface create(int param)
    {
        if (param == 0)
            return new ImplA();
        else
            return new ImplB();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyService
{
    public void serveMe(int param)
    {
        MyInterface.create(param).doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道接口是否知道它的实现,或者父类知道它的子类型是不是很糟糕.所以

  1. 我应该把这个逻辑放在哪里?
  2. 如果我选择一个类型的子类,那会改变很多吗?

Ant*_*sss 7

使用Factory此.这样你就可以维护single responsibility principle.interface然而,在我自己的一个项目中定义了一种方法,该方法确定应该使用这种特定实现的参数类型.由于这个和使用Reflections,整个过程是自动化的.Reflections查找实现给定的所有类,interface并将其"usage-type"存储在地图中以便快速查找.感谢这样的解决方案,如果他需要新的实现,所有开发人员必须做的就是创建它.系统的其他部分不需要进行其他修改,甚至在工厂类别也不需要.

Reflections 具有很好的功能,可以在编译时存储元数据,因此运行时查找正确的类是一眨眼