在创建底层对象的实例时使用接口注入

时间:2015-02-24 10:28:21

标签: java dependency-injection interface-injection

我有一个界面来表示具有竞争实现的数据结构。我需要在类中使用它,同时将类与必须知道底层数据结构分离。在这个类中,我需要创建这个实现的几个实例。如何使用界面注入来做到这一点?

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));
        }
  }

}

修改

我发现了一种使用接口注入的方法。创建工厂界面

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

并在构造函数

中注入它
Foo(DataStuctureFactory factory)

更改添加方法

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

2 个答案:

答案 0 :(得分:1)

这是你可以做的:

在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            
        }
  }

}

如何注入支持的数据结构的示例。请注意,您无法动态定义数据结构。您需要使用受支持的数据结构实现在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");

    }
}

答案 1 :(得分:0)

我发现了一种使用接口注入的方法。创建一个抽象工厂。

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

并在构造函数

中注入它
Foo(DataStuctureFactory factory)

更改添加方法

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