После прочтения и просмотра некоторых видеороликов при инъекции зависимостей я до сих пор не понимаю, как правильно ее использовать, не нарушая инкапсуляцию.Как избежать нарушения инкапсуляции при использовании инъекции зависимостей
Примечание: Я прочитал 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
из других пакетов, или есть что-то, чего я здесь не хватает?
Я не понимаю. Почему я хочу подвергнуть класс «Worker» внешнему миру, когда он имеет отношение только к пулу потоков? (Это деталь реализации пула потоков) – traveh
«Рабочий» - это конкретный класс. Следуя [Принцип инверсии зависимостей] (https://en.wikipedia.org/wiki/Dependency_inversion_principle), ничто не должно зависеть от конкретных классов (кроме корня композиции). – jaco0646
Статические методы, включая статические заводские методы, всегда будут [нарушать] (http://stackoverflow.com/questions/4002201/why-arent-static-methods-considered-good-oo-practice) объектно-ориентированные принципы. Это вовсе не означает, что вы должны упорно следовать объектно-ориентированным принципам. Действительно, статические фабрики являются общими; но если вы пытаетесь ослабить сцепление через инъекцию зависимостей, статическая фабрика сделает все наоборот. Он плотно соединяет «ThreadPool» и «Worker» вместе. – jaco0646