2017-10-13 168 views
0

禁止注射考慮一個門面通過訪問修飾符

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')。理由:你想禁止其他人使用它,那麼爲什麼要把它暴露在第一位呢?事實上,即使在與門面相同的包裝中,我也認爲這是門面的實施細節。 –

回答

0

只要您沒有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/ –