루프

2014-10-03 2 views
0
I이 상황에서 Implementation 대한 의존성 주입을 사용하고자

내부 통해 인스턴스 타입 종속성을 주입 :루프

I 수집 그럭저럭만큼
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); 
     } 
    } 
} 

, 이것은 불가능하다. 생성자를 통한 주입이나 제네릭을 사용하지 마십시오. 또한, 나는 이것을 달성하기 위해 외부 라이브러리에 의존하지 않는 원시 솔루션을 선호합니다.


편집 : 이 모든 솔루션은 DummyClassInterfaceType의 구현은 루프 내에서 인스턴스화되어야하는에 대해 알 필요가 없습니다 것을 요구한다.

제네릭 사용에 대해 생각했지만 InterfaceType testVar = new T(i);은 허용되지 않았습니다. 또한 인수가 필요한 생성자 때문에 newInstance() 메서드를 사용할 수 없습니다. 여전히 가능했지만 너무 많은 반영 (getConstructor)과 깨끗한 접근 방식에 대한 유형 안전성의 상실이 필요했습니다.

내가 달성하려고하는 것이 어떤 권장 방법으로도 달성 될 수 없다는 사실에 대해 저는 매우 만족합니다. 이 질문은 내가 무언가를 놓쳤다는 희망에있다.


Edit2가 : 나는 하나 drewmoore에 의해 제공하지만 난에 대해 생각하지 않았다 결함 건너 온 유사한 솔루션으로 이동하려고했다.

인터페이스는 생성자에 대한 요구 사항을 선언하지 않습니다. 이 메서드를 사용하면 인터페이스의 모든 구현에서 동일한 생성자를 사용해야 할 것입니다.

이렇게하면 건축업자 패턴에 대해 생각하게되었습니다. 인터페이스와 동일한주의 사항에 여전히 도달하여 구현 방법을 정의 할 필요가 있으며, 따라서 모든 구현이 어떻게 구성되어야하는지에 대한 요구 사항을 다시 만들어야합니다.

지연 건설을위한 다른 방법이 있습니까? 즉, 내가 사용하고자하는 구현 (public DummyClass(InterfaceType implementation))의 인스턴스를 삽입 할 수있게 해주는 수단으로, 루프 내부에서 생성 (또는 빌드 또는 초기화) 만하면 자체 복사본을 반환합니다.

하지만 다시. 나는 내가 성취하고자하는 것이 가능하지 않을 것이라고 점차 느끼고있다. 또는 부당한 추가 복잡성 또는 부과 된 제한으로 인해서는 안됩니다. 그런 다음 구현에 대한이 클래스의 직접적인 종속성을 수락하고 그녀의 통찰력에 대해 드루 모어에게 감사 할 것입니다.

+1

문제는 나에게 분명하지 않다. 달성하고자하는 것에 대해 더 자세히 설명해 주시겠습니까? – Numbers

+0

'DummyClass'가'Implementation'에 의존하지 않기를 바랍니다. '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); 
     } 
    } 
}