【问题标题】:Dependency injection for java 8 default interface methodsjava 8默认接口方法的依赖注入
【发布时间】:2017-03-03 03:41:35
【问题描述】:

我有一个使用 java 8 默认方法定义 setter/getter 的接口,但在 Spring 中尝试连接它时出现错误。我真的想避免使用抽象类,我不想复制代码。这是我正在做的事情:

public interface MyProcessor
{
  public static final WeakHashMap<Function1D, Integer> paramMap = new WeakHashMap<>();

  default void setParam(int param)
  {
        paramMap.put(this, param);
  }

  default int getParam()
  {
      return paramMap.get(this);
  } 

  default double doSomthingWithParam(double x)
  {  
          return doSomething() * getParam();
  } 

  double doSomething();
 }


public class MyProcessorImp extends SomeClass implements MyProcessor
{
    double doSomething() {....}
 } 

  <bean class="....MyProcessorImp"> <property name="param" value="3"/></bean>

Bean 属性 'param' 不可写或具有无效的 setter 方法。

【问题讨论】:

  • 为什么要避免使用抽象类?继承实现正是抽象类的用途。另外,你真的是想让paramMap 成为static 吗?请注意,这意味着只有一个paramMap 在实现该接口的所有类的所有实例之间共享。
  • 是的,我的意思是它是静态的,它是唯一可以工作的方式。我感觉对我的问题的回答会是这样的问题,我现在不想进入编程模型,但只是把它作为一个正当理由,并阅读 java 8 默认方法,问问自己为什么它被添加为新的架构特性,然后你可能会理解我的原因。
  • 在 Java 8 中添加默认方法的主要原因是可以在不破坏向后兼容性的情况下向接口添加方法——而不是作为抽象类的替代品。
  • 好。所以现在你可能知道我为什么需要这样做了。实际上,您应该注意,虽然您认为这是主要原因,但实际上,这是模型运行不佳的症状。我想将这种更改视为您所暗示的向后兼容性的破解,而更多的是架构更改以允许更丰富的编程模型,这反过来又解决了 Java 以前无法处理的问题。无论哪种方式,我都在寻找让这种特定设置发挥作用的想法,而不是关于其用法的苏格拉底式辩论。
  • 在我的例子中,在 Java 支持多重继承子类之前,没有抽象类的位置。我有诸如 XxxSupport 之类的类,并希望将它们的 getter 和 setter 混合到现有的类中。

标签: java spring


【解决方案1】:

在我自己的项目中,我让实现者向我提供 spring 的 DI 容器提供的依赖项。

修改上面的代码,如下所示:

public interface MyProcessor {

  // get the implementor to get the hash map
  WeakHashMap<Function1D, Integer> getParamMap();

  default double doSomthingWithParam(double x) {  
    return doSomething() * getParam();
  } 

  // uses the implementor's getParamMap() to get params
  default int getParam() {
    return getParamMap().get(this);
  } 

  double doSomething();
}

public class MyProcessorImp extends SomeClass implements MyProcessor {

  final WeakHashMap<Function1D, Integer> paramMap = new WeakHashMap<>();

  void setParam(int param) {
    paramMap.put(this, param);
  }

  @Override WeakHashMap<Function1D, Integer> getParamMap() {
    return paramMap;
  }

  @Override double doSomething() { 
    // elided 
  }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多