Esiste una regola DesignForExtensionCheckstyle. Dice: se si dispone di un metodo pubblico/protetto che non è astratto né definitivo né vuoto, non è "progettato per l'estensione". Leggi lo description for this rule on the Checkstyle page per la logica.Come progettare per l'estensione
Immagina questo caso. Ho una classe astratta che definisce alcuni campi e un metodo validate per i campi:
public abstract class Plant {
private String roots;
private String trunk;
// setters go here
protected void validate() {
if (roots == null) throw new IllegalArgumentException("No roots!");
if (trunk == null) throw new IllegalArgumentException("No trunk!");
}
public abstract void grow();
}
Ho anche una sottoclasse di Plant:
public class Tree extends Plant {
private List<String> leaves;
// setters go here
@Overrides
protected void validate() {
super.validate();
if (leaves == null) throw new IllegalArgumentException("No leaves!");
}
public void grow() {
validate();
// grow process
}
}
Dopo la Checkstyle governare il Plant.validate (metodo) non è progettato per l'estensione. Ma come posso progettare l'estensione in questo caso?
Non si dovrebbe gettare un IllegalArgumentException in un metodo che non accetta argomenti. .. – markt
@markt Facciamo finta che sia IllegalStateException nell'interesse dell'argomento :) –