【问题标题】:How to provide implementation externally using java interfaces [closed]如何使用java接口在外部提供实现[关闭]
【发布时间】:2013-11-12 20:57:35
【问题描述】:

我正在自学创建可以在外部覆盖的类,基本上是为了模拟一个我只提供接口实现的框架。 我注意到 hadoop 实际使用:

job.setMapperClass(FrameworkObject.class);

在驱动程序类中执行此操作,是否只需更改以下代码即可执行此操作?

//----- locked framwork interface...
public interface FrameworkInterface {
    public void PrintStuff();
}

//----- locked framwork factory class...
public class FrameworkFactory {

    public static void doStuff(FrameworkInterface fi){
        fi.PrintStuff();
    }
}

//------------ my code that hooks into a framework...
public class FrameworkObject implements FrameworkInterface {

    public FrameworkObject() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void PrintStuff() {
        System.out.println("the implemented method...");
    }
}

//------------ the framework driver I want to change 
public class FrameworkDriver {

    public static void main(String[] args){
        FrameworkFactory.doStuff(new FrameworkObject()); // explicit ref to object
    }
}

【问题讨论】:

    标签: java hadoop frameworks overriding implementation


    【解决方案1】:

    在所有框架中,您都需要一个配置映射或组件注入的入口点。在您的示例中,这是 FrameworkDriver。 不可能简单地扫描实现并动态加载它们。我会建议两种可能的解决方案之一。

    1) 您向 FrameworkDriver 添加一个方法,该方法创建在创建框架时使用的 FrameworkObject(扩展类需要覆盖 main,否则它将创建原始类的实例并错过此扩展) .这允许 FrameworkDriver 的其他实现覆盖它并提供替代实现。

    2) 您的驱动程序读取包含对象的类名或其工厂的系统属性或文件,因此您不再需要对其进行编码。许多依赖注入框架都使用了这种方法,有些框架通过以下方式自动处理它从构建插件或其他源处理器生成文件。

    虽然您可能最好使用现成的系统,例如Guice

    【讨论】:

    • 太好了,我会尝试选项 1 并发布结果。谢谢你的建议:)
    【解决方案2】:

    如果您正在寻找内置机制,那么自定义 Service Provider 可能是您的答案(自 Java 1.6 起可用)。

    【讨论】:

    • 好吧,我实际上暂时想尝试一下“第一校长”,但感谢您的回答。我已经根据 ajwillia 的建议进行了更改,但我不能再发布 8 小时;)
    【解决方案3】:

    这是我解决问题的快速技巧,然后它采用任何可以转换为 FrameworkInterface 的类...认为这就是您的意思 ajwillia.ms 吗?

    public class FrameworkFactory {
    
    public static void doStuff(Class<?> class1) throws Exception{
            FrameworkInterface fi = (FrameworkInterface) class1.newInstance();
            fi.PrintStuff();
    }   
    }
    
    public class FrameworkDriver {
    
    public static void main(String[] args) throws Exception{
        FrameworkFactory.doStuff(FrameworkObject.class);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多