发现循环依赖的问题

Spot problems with circular dependency

我正在设计一个系统,其中有两个模块,一个是手势文件,另一个是用户。对于某些逻辑操作,他们需要对方提供的服务。

每个模块都由一个单例表示,该单例实现了一个相互提供一些服务的接口,并使用抽象工厂来提供它们,如下所示:

public class UserMain implements UserInternalService {

/*
 * Internal interfaces
 */
/**
 * Allows interaction with the projects database.
 */
FilesInternaService fileSystem;

/**
 * Constructor is private, as this is a singleton.
 */
protected UserMain() {
}

private static UserMain singleton = null;

/**
 * Singleton factory. Returns a reference to the singleton. If there is no
 * reference yet, creates it.
 */
protected static synchronized UserMain getReference() {
    if (singleton == null) {
        singleton = new UserMain();
        singleton.fileSystem = FileMain.getInternalService();
    }
    return singleton;
}

/**
 * Factory method for the singleton as a UserInternalService
 */
public static UserInternalService getUserInternalService() {
    return getReference();
}

}

而文件模块 main class 是这样的:

public class FileMain implements FilesInternaService{

/**
 * Interface to user subsystem for request validation, etc.
 */
UserInternalService userSystem;

/**
 * Creation of instances aside from singleton disallowed.
 */
protected FileMain(){};

private static FileMain singleton = null;

/**
 * Singleton factory.
 * Returns a reference to the singleton.
 * If there is no reference yet, creates it.
 */
protected synchronized static FileMain getReference(){
    if(singleton == null)
        singleton = new FileMain();
        singleton.userSystem = UserMain.getUserInternalService();
    return singleton;
}

/**
 * Abstract factory for Internal Services singleton.
 * @return
 */
public static FilesInternaService getInternalService(){
    return getReference();
}
}

我不确定我是否正确处理了循环依赖。 有什么方法可能会意外中断吗?

编辑:正如下面已经回答的那样,处理这个问题的正确方法是注入。然而,正确的处理方法不是我在这里问的,而是这个特定的解决方案怎么会爆炸。

处理这个问题的简洁方法是使用依赖注入,将依赖关系保持在接口级别。

UserMain可以依赖FilesInternaServiceFileMain可以依赖UserInternalService;但是 UserMain 依赖于 FileMainFileMain 依赖于 UserMain 是不行的。也就是说,依赖具体实现是不行的。

FilesInternaService 的一个实例应该被注入到 UserMain 并且 UserInternalService 的一个实例应该被注入到 FileMain.


参考文献

  1. Are circular dependencies considered bad design?
  2. Why are circular references considered harmful?
  3. https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references
  4. https://softwareengineering.stackexchange.com/questions/306483/how-to-solve-circular-dependency