CheckstyleルールDesignForExtensionがあります。それは言います:あなたがabstractでもfinalでも空でもないpublic/protectedメソッドを持っているなら、それは「拡張のために設計された」ものではありません。根拠については、Checkstyle ページのこのルールの説明をお読みください。
この場合を想像してみてください。いくつかのフィールドを定義する抽象クラスと、それらのフィールドの検証メソッドがあります。
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();
}
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
}
}
Checkstyle ルールに従って、 Plant.validate() メソッドは拡張用に設計されていません。しかし、この場合、どのように拡張を設計すればよいのでしょうか?