通过访问修饰符

问题描述:

禁止注射考虑一个门面通过访问修饰符

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

+0

你不能只是让日志服务不公开吗? –

+0

你建议使用哪种修饰语? – Chris311

+0

你想让'LoggingService'成为一个CDI bean吗? (如果是的话为什么?)如果不是,你可以使类包私有(也可能是'@ Vetoed')。理由:你想禁止其他人使用它,那么为什么要把它暴露在第一位呢?事实上,即使在与门面相同的包装中,我也认为这是门面的实施细节。 –

只要您没有Java 9模块系统,就没有办法做到这一点。

使用Java 9,您可以定义一个不导出LoggingService的独立模块。

+0

拼图...我想你不会被你使用的IDE警告。我想你会在编译时得到错误!?我不确定这是多么有用。它影响很大。 – Chris311

+0

使用支持Java 9的IDE,就像现在大部分的操作一样,您不能使用未导出的类。像在IntelliJ中一样https://blog.jetbrains.com/idea/2017/09/java-9-and-intellij-idea/ –