通过访问修饰符
禁止注射考虑一个门面通过访问修饰符
public interface LoggingFacade {
void log(String logMessage);
}
与在同一封装内相应的bean
public class LoggingBean implements LoggingFacade {
@Inject
private LoggingService loggingService;
@Override
public void log(String logMessage) {
loggingService.log(logMessage);
}
}
与
public class LoggingService {
public void log(String logMessage) {
// some logic and logging
}
}
他们所有的谎言。我希望每个程序员都可以调用Facade,而不是直接调用服务(在其他包中)。所以我试图给LoggingService
添加一个受保护的构造函数。
public class LoggingService {
protected LoggingService() {
}
public void log(String logMessage) {
// some logic and logging
}
}
不幸的是,这并不禁止的LoggingService
使用(喷射)的其他类。换句话说,
public class MyClass {
@Inject
private LoggingService loggingService;
public void foo() {
loggingService.log("Hello");
}
}
的作品。你有什么想法如何禁止使用LoggingService
,所以每个用户必须拨打LoggingFacade
?
只要您没有Java 9模块系统,就没有办法做到这一点。
使用Java 9,您可以定义一个不导出LoggingService的独立模块。
拼图...我想你不会被你使用的IDE警告。我想你会在编译时得到错误!?我不确定这是多么有用。它影响很大。 – Chris311
使用支持Java 9的IDE,就像现在大部分的操作一样,您不能使用未导出的类。像在IntelliJ中一样https://blog.jetbrains.com/idea/2017/09/java-9-and-intellij-idea/ –
你不能只是让日志服务不公开吗? –
你建议使用哪种修饰语? – Chris311
你想让'LoggingService'成为一个CDI bean吗? (如果是的话为什么?)如果不是,你可以使类包私有(也可能是'@ Vetoed')。理由:你想禁止其他人使用它,那么为什么要把它暴露在第一位呢?事实上,即使在与门面相同的包装中,我也认为这是门面的实施细节。 –