No, non è un odore di codice.
- Se una classe non è definitiva, consente di essere sottoclasse.
- Se un metodo non è definitivo, può essere sovrascritto.
Si trova all'interno delle responsabilità di ogni classe di considerare attentamente se la sottoclasse è appropriata e quali metodi possono essere sovrascritti .
La classe può definire se stessa o qualsiasi metodo come finale, oppure può porre restrizioni (modificatori di visibilità, costruttori disponibili) su come e dove è sottoclasse.
Il solito caso per i metodi di sovrascrittura è una implementazione predefinita nella classe base che può essere personalizzata o ottimizzata nella sottoclasse (specialmente in Java 8 con l'avvento dei metodi predefiniti nelle interfacce).
class A {
public String getDescription(Element e) {
// return default description for element
}
}
class B extends A {
public String getDescription(Element e) {
// return customized description for element
}
}
Un'alternativa per il comportamento di override è il Pattern di strategia , in cui il comportamento è astratto come un'interfaccia e l'implementazione può essere impostata nella classe.
interface DescriptionProvider {
String getDescription(Element e);
}
class A {
private DescriptionProvider provider=new DefaultDescriptionProvider();
public final String getDescription(Element e) {
return provider.getDescription(e);
}
public final void setDescriptionProvider(@NotNull DescriptionProvider provider) {
this.provider=provider;
}
}
class B extends A {
public B() {
setDescriptionProvider(new CustomDescriptionProvider());
}
}