您鏈接到的文檔已經解釋了檢查背後的基本原理。這在某些情況下可能很有用。在實踐中,我從來沒有打開它,主要是因爲它管理起來太麻煩,而且你肯定不希望你的課程可以用於全部。
但你問了一個代碼示例。考慮這兩個類(YourSuperClass
爲您提供的API的一部分,TheirSubClass
是由您的API的用戶提供):
public abstract class YourSuperClass
{
public final void execute() {
doStuff();
hook();
doStuff();
}
private void doStuff() {
calculateStuff();
// do lots of stuff
}
protected abstract void hook();
protected final void calculateStuff() {
// perform your calculation of stuff
}
}
public class TheirSubClass extends YourSuperClass
{
protected void hook() {
// do whatever the hook needs to do as part of execute(), e.g.:
calculateStuff();
}
public static void main(final String[] args) {
TheirSubClass cmd = new TheirSubClass();
cmd.execute();
}
}
在這個例子中,TheirSubClass
不能改變方式execute
的作品(做東西,掛鉤,再做些東西)。它也不能更改calculateStuff()
方法。因此,YourSuperClass
是「爲擴展而設計的」,因爲TheirSubClass
不能破壞它的運行方式(比如說,如果不是final
)。 YourSuperClass
的設計者仍然處於控制之下,只爲子類提供特定的掛鉤。如果hook
是abstract
,TheirSubClass
被迫提供一個實現。如果它只是一個空方法,TheirSubClass
可以選擇不使用鉤子。
Checkstyle的Check
是爲擴展而設計的一個實例。具有諷刺意味的是,它仍然無法通過檢查,因爲getAcceptableTokens()
是public
而不是final
。
所有你需要的是「在實踐中,我從來沒有打開它,主要是因爲管理太繁瑣,而且你肯定不希望它在你所有的課程中都能使用。」 - 非常感謝您的意見和答覆。看起來沒有人使用它,因爲它不可能遵循它。 –
爲了清楚起見,我仍然認爲這是一個非常有用的檢查,因爲這是確保以這種方式「延期設計」的課程在以後的維護期間不會中斷的好方法。也許Checkstyle團隊有一天會添加一個選項來指定要運行檢查的單個類的模式(因爲不能合理地強制每個類都遵循這種模式)。 –
此檢查將更新爲正確且有用https://github.com/checkstyle/checkstyle/issues/3102 –