0

종속성 주입에서 일부 비디오를 읽고보고 난 후에도 캡슐화를 중단하지 않고 올바르게 사용하는 방법을 여전히 이해하지 못합니다.종속성 주입을 사용할 때 캡슐화가 깨지는 것을 방지하는 방법

참고 : 나는 How to use Dependency Injection without breaking encapsulation?을 읽었지만 여전히 100 % 확실하지 않습니다.

내 코드는 스레드 풀의 매우 간단한 구현으로, 외부 세계에 드러내고 싶지 않은 패키지 전용 클래스 인 Worker 클래스의 객체를 포함합니다 (실제로는 걱정할 필요가 없습니다).

내 스레드 풀 생성자에는 매개 변수 Worker[] workers이 필요합니다 (필요한 근로자 수를 정확히 알고 있기 때문에 공장이 필요하지 않습니다). ,

public static ThreadPool createThreadPool(int numOfWorkers, 
              BlockingQueue<Runnable> jobQueue, 
              ThreadFactory threadFactory) { 

    Worker workers[] = new Worker[numOfWorkers]; 
    for (int i = 0; i < workers.length; i++) { 
     workers[i] = new Worker(jobQueue, threadFactory, i); 
     // worker needs the factory in order to provide itself as Runnable 
    } 
    return new ThreadPool(workers, jobQueue); 
} 

을 그래서 모든 만드는 : 내 Worker 클래스 이후

내가 다음과 같이 스레드 공장을 건설하는 올바른 방법이 ThreadPool 클래스의 정적 팩토리 메소드를 구현하는 것이라고 생각 패키지 개인이다 정적 팩토리 메서드에서 이러한 새로운 객체는 다른 패키지에서 Worker 클래스를 숨길 수있는 올바른 방법입니까 아니면 여기에 누락 된 것이 있습니까?

답변

0

종속성 삽입은 ThreadPool에서 Worker을 생성하는 것을 숨기는 것을 의미합니다. 이상적으로는 RunnableThreadPool 생성자로 전달해야하며 ThreadPoolRunnableWorker 일 수 있음을 알지 못합니다.

Worker의 생성은 composition root에 있어야합니다.

+0

이해가 안됩니다. 왜'Worker' 클래스가 스레드 풀 자체에만 관련이있을 때 외부 세계에 노출시키고 싶습니까? (스레드 풀의 구현 세부 사항입니다.) – traveh

+0

'Worker'는 구체적인 클래스입니다. [Dependency Inversion Principle] (https://en.wikipedia.org/wiki/Dependency_inversion_principle)에 따르면, 구체적인 클래스 (구성 루트 제외)에 의존하지 않아도됩니다. – jaco0646

+0

정적 팩토리 메서드를 비롯한 정적 메서드는 항상 개체 지향 원칙에 따라 [위반]됩니다 (http://stackoverflow.com/questions/4002201/why-arent-static-methods-considered-good-oo-practice). 그렇다고해서 객체 지향 원칙을 따르지 않아도된다는 뜻은 아닙니다. 실제로 고정 된 공장은 일반적입니다. 의존성 주입을 통해 커플 링을 느슨하게하려한다면, 정적 팩토리는 그 반대를 할 것입니다. 'ThreadPool'과'Worker'를 단단히 연결합니다. – jaco0646

관련 문제