2014-10-03 125 views
0

我想在这种情况下,使用依赖注入Implementation内实例化类型:依赖注入的循环

public interface Implementable{[...]} 
public class Implementation implements Implementable{[...]} 

public class DummyClass() 
{ 
    private List<Implementable> testList; 
    public DummyClass() 
    { 
     testList = new ArrayList<Implementable>(); 
     for(int i = 0; i < 10; i++) 
     { 
      Implementable testVar = new Implementation(i); 
      testList.add(testVar); 
     } 
    } 
} 

虽然我设法收集多了,这是不可能的。无论是通过构造函数注入还是使用泛型。另外,我更喜欢不依靠外部库来实现这一目标的本地解决方案。


编辑: 任何解决方案将需要DummyClass就不会知道哪一个实现的InterfaceType是在循环内被实例化。

我正在考虑使用泛型,但由于InterfaceType testVar = new T(i);是不允许的,因此失败。另外,由于需要参数的构造函数,newInstance()方法不可行。虽然这仍然是可能的,但它需要太多的反思(getConstructor)和类型安全性的损失,因为我对干净方法的尝试。

我非常满意地听到我试图达到的目标无法以任何可推荐的方式实现。这个问题是希望我确实错过了一些东西。


EDIT2: 我试图去同一个类似的解决方案的一个由drewmoore提供而是跨越,我没有想过一个缺陷来了。

接口不声明构造函数的任何要求。有了这个方法,我将不得不在接口的所有实现中使用相同的构造函数。

这让我想起了建造者模式。这仍然与界面需要定义构建方法一样需要警惕,因此需要再次制定所有实现的构建要求。

是否有其他延迟施工方式?也就是说,一种方法可以使我注入我想要使用的实现实例(public DummyClass(InterfaceType implementation)),但只能在循环内部构建(或构建或初始化)它,然后才能返回它自己的副本。

但话又说回来。我越来越觉得我试图达到的目标是不可能的。或者不应该因为不合理的额外复杂性或强加的限制而完成。我可能宁愿接受这个类对实现的直接依赖,并感谢drewmoore对她的见解。

+1

的问题是,我也不清楚。你能否添加更多关于你想要实现的细节? – Numbers 2014-10-03 22:25:47

+0

我想'DummyClass'不要依赖'Implementation'。只在接口'InterfaceType'上。我可以看到可能实现的唯一途径似乎是注入。只有在我的情况下,我不能简单地注入一个实例并使用它,因为循环会根据循环计数器创建不同的实例。 – 2014-10-03 22:50:03

回答

0

给这个进一步的思考后,和我来到了以下结论drewmoore的现在不幸的是删除了答案启发:

虽然我感到不安有关使用一个接口来声明对施工合同,在我的第二个声明编辑,我现在意识到这正是这种情况所需要的。我的意思是能够在循环内以某种方式构造这个对象。因此,必须制定该循环所需的要求。自然界面是这项工作的理想选择。

以最初的例子,我的解决办法是这样的:

DummyClass dummyInstance = new DummyClass(new ImplementationProvider()); 

/////// 

public interface Implementable{[...]} 
public class Implementation implements Implementable{[...]} 

public interface ImplementationProviderAware 
{ 
    public Implementable createImplementation(Integer counter); 
} 

public class ImplementationProvider implements ImplementationProviderAware 
{ 
    public Implementable createImplementation(Integer counter) 
    { 
     return new Implementation(counter); 
    } 
} 

public class DummyClass(ImplementationProviderAware implementationProvider) 
{ 
    private List<Implementable> testList; 
    public DummyClass() 
    { 
     testList = new ArrayList<Implementable>(); 
     for(int i = 0; i < 10; i++) 
     { 
      Implementable testVar = implementationProvider.createImplementation(i); 
      testList.add(testVar); 
     } 
    } 
}