0

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

Примечание: Я прочитал How to use Dependency Injection without breaking encapsulation?, но я все еще не уверен на 100%.

Мой код - очень простая реализация пула потоков, которая содержит объекты класса Worker, который является частным классом, который я не хочу раскрывать внешнему миру (и это действительно не их проблема).

Мой конструктор пула потоков требует параметра Worker[] workers (Мне не нужна фабрика, так как я заранее знаю, сколько рабочих мне нужно).

Поскольку мой Worker класса пакет-частного Я думал, что правильный способ построить нить завод будет реализовать статический метод фабрики в ThreadPool классе следующим образом:

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 из других пакетов, или есть что-то, чего я здесь не хватает?

ответ

0

Зависимость Инъекция означала бы скрытие создания Worker s от ThreadPool. В идеале Runnable s должен быть передан в конструктор ThreadPool, и ThreadPool не должен даже знать, что Runnable s Worker s.

Создание Worker s должно происходить в composition root.

+0

Я не понимаю. Почему я хочу подвергнуть класс «Worker» внешнему миру, когда он имеет отношение только к пулу потоков? (Это деталь реализации пула потоков) – traveh

+0

«Рабочий» - это конкретный класс. Следуя [Принцип инверсии зависимостей] (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