A muszą być te adnotacje? Jeśli nie to możesz wykorzystać dziedziczenie albo kompozycję.
Przykład z dziedziczeniem:
abstract class Service {
protected abstract void securityCheck()
public int firstMethod() {
securityCheck();
// implementacja
}
public int secondMethod() {
securityCheck();
// implementacja
}
}
class SecuredService {
// nadpisuje securityCheck i w środku sprawdza zabezpieczenia
}
class UnsecuredService {
// nadpisuje securityCheck i w środku nic nie robi
}
Przykład z kompozycją:
class SecurityChecker {
public void securityCheck() {
// implementacja
}
}
class Service {
private final SecurityChecker securityChecker = ??? ;
public int firstMethod() {
securityChecker.check();
// implementacja
}
public int secondMethod() {
securityChecker.check();
// implementacja
}
}
Powyższy sposób jest jednak taki mocno imperatywny. Zamiast mieć wszędzie voidy mógłbyś postawiać jakieś lambdy, dodatkowe typy opakowujące wynik (SecurityChecked<T>
?), itd Możliwe też, że zabezpieczenia masz w złym miejscu, np uruchamiasz je później niż mógłbyś.