2017-10-13 6 views
0

介して注射を禁止アクセス修飾子

public class LoggingService { 
    public void log(String logMessage) { 
     // some logic and logging 
    } 
} 

彼らは同じパッケージ内のすべての位置でビーン

public class LoggingBean implements LoggingFacade { 
    @Inject 
    private LoggingService loggingService; 

    @Override 
    public void log(String logMessage) { 
     loggingService.log(logMessage); 
    } 
} 

を対応するファサード

public interface LoggingFacade { 
    void log(String logMessage); 
} 

を考えます。私はすべてのプログラマーにファサードを呼び出し、サービスを直接(他のパッケージで)呼び出さないようにしたい。そこで、保護されたコンストラクタを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/ –