2013-10-26 32 views
3

檢查:http://checkstyle.sourceforge.net/config_design.html#DesignForExtension有人在Checkstyle中查看DesignForExtension Check的原因嗎?

誤報:Checkstyle "Method Not Designed For Extension" error being incorrectly issued? checkstyle Method is not designed for extension - needs to be abstract, final or empty https://sourceforge.net/p/checkstyle/bugs/688/

看起來像所有交換機在其配置檢查關。

有沒有人可以顯示這個檢查有用的真實代碼示例? 開發者在實踐中是否有用,而不是在理論上?

回答

3

您鏈接到的文檔已經解釋了檢查背後的基本原理。這在某些情況下可能很有用。在實踐中,我從來沒有打開它,主要是因爲它管理起來太麻煩,而且你肯定不希望你的課程可以用於全部

但你問了一個代碼示例。考慮這兩個類(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的設計者仍然處於控制之下,只爲子類提供特定的掛鉤。如果hookabstract,TheirSubClass被迫提供一個實現。如果它只是一個空方法,TheirSubClass可以選擇不使用鉤子。

Checkstyle的Check是爲擴展而設計的一個實例。具有諷刺意味的是,它仍然無法通過檢查,因爲getAcceptableTokens()public而不是final

+0

所有你需要的是「在實踐中,我從來沒有打開它,主要是因爲管理太繁瑣,而且你肯定不希望它在你所有的課程中都能使用。」 - 非常感謝您的意見和答覆。看起來沒有人使用它,因爲它不可能遵循它。 –

+0

爲了清楚起見,我仍然認爲這是一個非常有用的檢查,因爲這是確保以這種方式「延期設計」的課程在以後的維護期間不會中斷的好方法。也許Checkstyle團隊有一天會添加一個選項來指定要運行檢查的單個類的模式(因爲不能合理地強制每個類都遵循這種模式)。 –

+0

此檢查將更新爲正確且有用https://github.com/checkstyle/checkstyle/issues/3102 –

相關問題