发现循环依赖的问题
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
可以依赖FilesInternaService
,FileMain
可以依赖UserInternalService
;但是 UserMain
依赖于 FileMain
或 FileMain
依赖于 UserMain
是不行的。也就是说,依赖具体实现是不行的。
FilesInternaService
的一个实例应该被注入到 UserMain
并且 UserInternalService
的一个实例应该被注入到 FileMain
.
参考文献
- Are circular dependencies considered bad design?
- Why are circular references considered harmful?
- https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references
- https://softwareengineering.stackexchange.com/questions/306483/how-to-solve-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
可以依赖FilesInternaService
,FileMain
可以依赖UserInternalService
;但是 UserMain
依赖于 FileMain
或 FileMain
依赖于 UserMain
是不行的。也就是说,依赖具体实现是不行的。
FilesInternaService
的一个实例应该被注入到 UserMain
并且 UserInternalService
的一个实例应该被注入到 FileMain
.
参考文献
- Are circular dependencies considered bad design?
- Why are circular references considered harmful?
- https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references
- https://softwareengineering.stackexchange.com/questions/306483/how-to-solve-circular-dependency