Diciamo che ho queste due classi, una estendendo l'altraAvvisa sviluppatore di chiamare `super.foo()` in java
public class Bar{
public void foo(){
}
}
public class FooBar extends Bar {
@Override
public void foo(){
super.foo(); //<-- Line in question
}
}
Quello che voglio fare è avvisare l'utente alla chiamata del super-class metodo foo
se non hanno il metodo di override, è possibile?
O c'è un modo per sapere, usando la riflessione che un metodo che sovrascrive un metodo della sua super-classe chiama il metodo originale se passo il tipo di classe al super?
ad esempio:
public abstract class Bar{
public Bar(Class<? extends Bar> cls){
Object instance = getInstance();
if (!instance.getClass().equals(cls)) {
throw new EntityException("The instance given does not match the class given.");
}
//Find the method here if it has been overriden then throw an exception
//If the super method isn't being called in that method
}
public abstract Object getInstance();
public void foo(){
}
}
public class FooBar extends Bar {
public FooBar(){
super(FooBar.class);
}
@Override
public Object getInstance(){
return this;
}
@Override
public void foo(){
super.foo();
}
}
Forse anche un'annotazione posso mettere sul metodo eccellente in modo che dimostra che ha bisogno di essere chiamato?
EDIT
Nota, non è il super classe che ha bisogno di chiamare il metodo foo, sarebbe qualcuno che chiama il metodo foo della classe secondaria, ad esempio, un metodo di database close
Sarei anche contento di rendere il metodo "non trascurabile" se ci si avvicina, ma vorrebbe comunque dargli un messaggio personalizzato.
Edit 2
Questo qui è quello che volevo in un modo:
ma sarebbe comunque bello avere quanto sopra, o anche dare loro un messaggio personalizzato per fare qualcos'altro come, Cannot override the final method from Bar, please call it from your implementation of the method instead
Questo potrebbe essere possibile con un codice statico strumento di analisi/controllo delle regole (ad es. IDEA). Probabilmente non dovrebbe essere fatto in fase di esecuzione (ad esempio con la riflessione). – user2864740
Se non è possibile utilizzare il modello di modello, FindBugs ha un'annotazione che rileva le sostituzioni mancanti: [OverrideMustInvoke] (http://findbugs.sourceforge.net/manual/annotations.html) –
* Sarei persino felice di creare metodo "non sovrascrivibile" *: questo è il significato di 'final'. –