java - 使用接口(interface)注入(inject),同时必须创建底层对象的实例

标签 java dependency-injection interface-injection

我有一个接口(interface)来表示具有竞争实现的数据结构。我需要在类中使用它,同时使类不必了解底层数据结构。在这个类中,我需要创建此实现的几个实例。如何使用接口(interface)注入(inject)来做到这一点?

class Foo {
  Map<String, IDataStructure> map = new HashMap<String, IDataStructure>();

  public void addValue(String key, String value) {
        if(!map.containsKey(key)) {
             map.put(key, new SomeDataStructure(value));
        }
  }

}

编辑

我找到了一种使用接口(interface)注入(inject)的方法。创建工厂接口(interface)

class ADataStructureFactory implements DataStructureFactory {
     IDataStructure create() {
         return new SomeDataStructure();
 }
}

并将其注入(inject)到构造函数中

Foo(DataStuctureFactory factory)

更改添加方法

public void addValue(String key, String value) {
     if(!map.containsKey(key)) {
           map.put(key, factory.create());
     }
}

最佳答案

这是你可以做的:

在 IDataStructure 中定义 add 方法:

public interface IDataStructure {
    public void add(String value);
}

创建名为 ListDataStructure 的 IDataStrucutre 实现,如下所示:

public class ListDataStructure implements IDataStructure {

    private List<String> dataStructure = new ArrayList<String>();
    @Override
    public void add(String value) {
        dataStructure.add(value);
    }

}

创建名为 SetDataStructure 的 IDataStructure 实现

public class SetDataStructure implements IDataStructure {

    private Set<String> dataStructure = new HashSet<String>();

    @Override
    public void add(String value) {
        dataStructure.add(value);
    }

}

按如下方式修改您的 Foo 类:

class Foo {
  private Map<String, IDataStructure> map;

  public Foo(Map<String,IDataStructure> map) {
      this.map = map;
  }

  public void addValue(String key, String value) {
        if(map.containsKey(key)) {
             map.get(key).add(value);
        } else {
           /*handle what happens when data structure does not exist. Maybe thow an exception            
        }
  }

}

如何注入(inject)支持的数据结构的示例。请注意,您无法即时定义数据结构。您需要使用受支持的数据结构实现预先填充 Foo 中的映射。

public class DataStructureExample {
    public static void main(String []args) {
        Map<String,IDataStructure> dataStrucures = new HashMap<String,IDataStructure>();

        //injecting different data structures into Foo
        dataStrucures.put("List", new ListDataStructure());
        dataStrucures.put("Set", new SetDataStructure());

        Foo foo = new Foo(dataStrucures);

        //add some value to a list data structure
        foo.addValue("List", "Value1");

        //add some valu to a set data structure
        foo.addValue("Set", "Value1");

    }
}

关于java - 使用接口(interface)注入(inject),同时必须创建底层对象的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28693324/

相关文章:

asp.net-mvc - MVC Code First 和具有复杂映射的 Ninject 缓存

.net - 除非在代码中引用,否则通过添加引用添加的程序集不会复制到输出目录

Java websocket连接检查同一用户是否重新连接

Java HttpsURLConnection 在没有 setSSLSocketFactory 设置的情况下成功执行

java - 覆盖 X-Powered-By HTTP header

java - 在java struts中抛出自定义错误消息

c# - ASP.Net Core 依赖注入(inject) |如何在创建时访问用户或路由数据