使用依赖注入时如何避免破坏封装

时间:2016-08-17 11:08:57

标签: multithreading unit-testing dependency-injection language-agnostic

在阅读并观看有关依赖注入的视频后,我仍然不了解如何在不破坏封装的情况下正确使用它。

注意:我看过How to use Dependency Injection without breaking encapsulation?,但我仍然没有100%确定。

我的代码是一个非常简单的线程池实现,它包含类Worker的对象,这是一个我不想暴露给外部世界的包私有类(而且它是&#39) ;真的不关心他们。)

我的线程池构造函数需要一个参数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类隐藏在其他包中,或者我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

依赖注入意味着隐藏WorkerThreadPool的创建。理想情况下,Runnable应该传递到ThreadPool构造函数中,而ThreadPool甚至不应该知道Runnable恰好是Worker

Worker中应创建filepath<-paste0(getwd(),"/Test.csv") filestring<-readChar(filepath, file.info(filepath)$size) filestring<-gsub('.','',filestring,fixed=TRUE) fread(filestring)

相关问题