2017-10-13 14 views
0

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?

+0

Ne pouvez-vous pas rendre le service de journalisation non public? –

+0

Quel modificateur suggérez-vous? – Chris311

+0

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. –

Répondre

0

Il n'y a aucun moyen de le faire tant que vous n'avez pas le système de module Java 9. Avec Java 9, vous pouvez définir un module distinct qui n'exporte pas LoggingService.

+0

Avec Jigsaw ... Je suppose que vous ne seriez pas averti par l'IDE que vous utilisez. Je suppose que vous obtiendrez l'erreur au moment de la compilation !? Je ne suis pas sûr de la façon dont c'est utilisable. Il y a beaucoup d'ombre. – Chris311

+0

Avec un IDE prenant en charge Java 9 comme vous le faites le plus souvent, vous ne pouvez pas utiliser une classe qui n'est pas exportée. Comme dans IntelliJ https://blog.jetbrains.com/idea/2017/09/java-9-and-intellij-idea/ –