2014-10-03 2 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); 
     } 
    } 
} 

Насколько мне удалось собрать, это не представляется возможным. Ни путем инъекции через конструктор, ни с помощью дженериков. Кроме того, я бы предпочел собственное решение, которое не полагается на внешнюю библиотеку для достижения этого.


Edit: Любое решение будет требовать, чтобы DummyClass не должны знать о том, какая реализация InterfaceType должна быть реализован внутри цикла.

Я думал об использовании дженериков, но это не удалось, так как InterfaceType testVar = new T(i); не допускается. Кроме того, метод newInstance() был невозможен из-за конструктора, требующего аргументов. В то время как это все еще было возможно, это потребовало слишком большого отражения (getConstructor) и потери безопасности типа для моего вкуса чистого подхода.

Я совершенно доволен, что то, чего я пытаюсь достичь, не может быть достигнуто ни в какой рекомендации. Этот вопрос в надежде, что я что-то пропустил.


Edit2: Я пытался идти с подобным решением той предоставленной drewmoore, но наткнулся на изъян, что я не думал о.

Интерфейсы не заявляют каких-либо требований к конструктору. С помощью этого метода мне пришлось бы использовать один и тот же конструктор во всех реализациях интерфейса.

Это заставило меня задуматься о шаблоне строителя. Который по-прежнему приходит к тому же предостережению, что и интерфейс, необходимо будет определить методы построения и, следовательно, снова придется создавать требования для того, как все реализации должны быть построены.

Есть ли другой способ для отложенного строительства? То есть, это средство, которое позволило бы мне ввести экземпляр реализации, которую я хотел бы использовать (public DummyClass(InterfaceType implementation)), но только конструировать (или строить или инициализировать) его внутри цикла, где он тогда будет возвращать копии самого себя.

Но с другой стороны. Я все больше чувствую, что то, чего я пытаюсь достичь, будет невозможно. Или что это не должно быть сделано из-за неоправданной дополнительной сложности или наложенных ограничений. Тогда я бы скорее согласился с прямой зависимостью этого класса от реализации и поблагодарил drewmoore за ее понимание.

+1

Вопрос не ясно для меня. Не могли бы вы добавить более подробную информацию о том, чего вы пытаетесь достичь? – Numbers

+0

Я бы хотел, чтобы 'DummyClass' не зависел от' Реализация'. Только на интерфейсе 'InterfaceType'. Единственный способ, который я вижу, чтобы достичь, кажется, инъекции. Только в моем случае я не могу просто вставить экземпляр и использовать его, потому что цикл создает разные экземпляры в зависимости от счетчика циклов. –

ответ

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); 
     } 
    } 
} 
Смежные вопросы