发现循环依赖的问题
我正在设计一个系统,其中有两个模块,一个是gestions文件,另一个是用户。 对于某些逻辑操作,他们需要彼此提供的服务。
每个模块都由一个单例表示,它实现了一个为彼此提供一些服务的接口,抽象工厂提供它们,如下所示:
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(); } }
而文件模块主类是这样的:
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(); } }
我并不完全确定我正确处理循环依赖。 这有什么办法可能会意外地破裂吗?
编辑 :正如下面的答案,处理这个问题的正确方法是注入。 但是,处理这个问题的正确方法不是我在这里要求的,而是这个特定的解决方案怎么会爆炸。
处理此问题的干净方法是使用dependency injection,以将依赖关系保持在接口级别。
UserMain
可以依赖UserMain
, FileMain
可以依赖UserInternalService
; 但UserMain
依赖FileMain
或FileMain
依赖于UserMain
。 换句话说,依靠具体实施是不行的。
应将UserMain
一个实例注入UserMain
并将一个UserInternalService
实例注入FileMain
。
参考