Considérons une façadeInterdire via modificateur d'accès
public interface LoggingFacade {
void log(String logMessage);
}
avec haricot correspondant
public class LoggingBean implements LoggingFacade {
@Inject
private LoggingService loggingService;
@Override
public void log(String logMessage) {
loggingService.log(logMessage);
}
}
avec
public class LoggingService {
public void log(String logMessage) {
// some logic and logging
}
}
Ils se trouvent tous dans le même emballage. Je veux que chaque programmeur appelle la façade et ne pas appeler le service directement (dans d'autres paquets). J'ai donc essayé d'ajouter un constructeur protégé à LoggingService
.
public class LoggingService {
protected LoggingService() {
}
public void log(String logMessage) {
// some logic and logging
}
}
Malheureusement, cela n'interdit pas l'usage (injection) de LoggingService
dans d'autres classes. Ou en d'autres termes
public class MyClass {
@Inject
private LoggingService loggingService;
public void foo() {
loggingService.log("Hello");
}
}
fonctionne. Avez-vous une idée de la façon d'interdire l'utilisation de LoggingService
de sorte que chaque utilisateur doit appeler le LoggingFacade
?
Ne pouvez-vous pas rendre le service de journalisation non public? –
Quel modificateur suggérez-vous? – Chris311
Voulez-vous que 'LoggingService' soit un bean CDI? (Si oui pourquoi?) Si non, vous pouvez créer la classe package-private (et probablement aussi @ Vetoed). Justification: vous voulez interdire à tout le monde de l'utiliser, alors pourquoi l'exposer en premier lieu? Le fait que ce soit même dans le même paquet que la façade me fait penser qu'il s'agit d'un détail de mise en œuvre de la façade. –