Questa potrebbe sembrare una cosa strana da volere, ma esiste un modo in Java per impedire alle sottoclassi di aggiungere nuovi metodi (compresi i costruttori) consentendo comunque alle sottoclassi di sovrascrivere i metodi?Prevenire le sottoclassi dall'aggiunta dei metodi
La situazione attuale è dove abbiamo una classe abstract
con alcuni metodi astratti e un costruttore
abstract class A {
abstract A doX();
abstract boolean isY();
public A(String s){ ... };
}
e vogliamo tutte le sottoclassi concrete di questa classe per eseguire l'override solo questi metodi e costruttore.
Si tratta di applicare un certo stile nel nostro codice, ovvero impedire ad altre persone che lavorano al codice di aggiungere cose. Potremmo semplicemente dirgli di no, ma raramente funziona, quindi ci chiedevamo se esistesse un modo programmatico per raggiungere questo obiettivo.
Ovviamente la classe non può essere final
. L'efficienza non è fondamentale: un codice più pulito è più importante.
Update - approccio dinamico
Come è stato sottolineato nelle risposte, non v'è alcun modo per farlo in modo statico, come l'unico modo per evitare di essere sottoclassi create sta usando final
, che non funziona. Ma potrei usare un approccio dinamico, quindi la mia soluzione attuale è aggiungere questo aspect
al progetto (che già utilizza AspectJ
).
public aspect WatchA{
before() : execute(* A.*()) || execute(* A.*(..)) {
String methodCalled = joinPoint.getSignature().getName();
Class<?> c = Class.forName(args[0])
Method[] allMethods = c.getDeclaredMethods();
boolean found = false;
for(Method m : allMethods)
found |= m.getName().equals(methodCalled);
if(!found)
throw new RuntimeException("Do not add method "+methodCalled+" to A");
}
}
Che causerà il fallimento dei test se utilizzano uno di questi nuovi metodi.
Java non lo consente. È meglio introdurre una rigorosa politica di revisione del codice. –
Per curiosità, perché è vietato l'ultimo? – fge
Voglio che le sottoclassi siano in grado di sovrascrivere i metodi ma non aggiungerli, quindi dobbiamo essere in grado di creare sottoclassi. Capisco che questo è tutto molto sopra-sottoscritto e, ad essere onesto, ora sono principalmente interessato solo se può essere fatto - penso che finiremo per andare con l'approccio "dillo a loro". – selig