介して注射を禁止アクセス修飾子
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
に電話しなければなりませんか?
ロギングサービスをパブリックにすることはできませんか? –
どの修飾語をお勧めしますか? – Chris311
'LoggingService'をCDI Beanにしますか? (もしそうなら、なぜですか?)いいえの場合、パッケージをプライベートにすることができます(おそらく '@ Vetoed')。理論的根拠:他の誰もがその使用を禁止したいのですが、なぜそれを最初に公開するのですか?それがファサードと同じパッケージでさえあるという事実は、それがファサードの実装の詳細だと思うようになります。 –