2011-12-07 47 views
7

是否可以使用Checkstyle禁止使用某些構造函數或使用與系統相關的默認值(語言環境,字符集等)的方法。我更願意強制執行一項政策,程序員應明確系統相關值。所以,我認爲以下項目是危險的:Checkstyle規則阻止調用某些方法和構造函數

  • 所有的使用依賴於系統的編碼java.io.FielWriter
    • 構造
  • java.io.OutputStreamWriter
    • OutputStreamWriter(OutputStream os)構造使用依賴於系統的編碼
  • java.lang.String.toLowerCase()方法
    • 使用系統默認語言環境
  • 的使用java.util.Calendar.getInstance()方法
    • 系統默認的語言環境和默認時區

(這樣的例子不勝枚舉,你得到的圖片)。

是否可以使用Checkstyle 5.5強制執行此操作?

+0

好問題。就我個人而言,我認爲這是編譯器本身應該默認警告的東西 - 如此多的可能的錯誤 - 使用這些方法幾乎是不對的。 – Voo

+1

Oracle應該爲這些方法添加@SystemDependant批註。 – gawi

+0

我寫了一個自定義檢查來避免新的Date(),如果您感興趣,請參閱以下內容:http://beansgocrazy.blogspot.com.au/2012/04/when-dates-go-wild.html – n0rm1e

回答

1

默認情況下,你不能這樣做。但是,您可以實現自己的檢查器來檢查這些方法。

第一個選項是使用雜項 - >正則表達式。這顯然只有在您可以找到使用正則表達式的違規時纔有可能。你將需要設置illegalPattern = true。我認爲這將是一個很好的開始。

第二種選擇是創建自己的支票。見Writing Checks

寫作跳棋是有限制的。第一個也是最重要的是你看不到其他文件。沒有任何交叉檢查。來自網站:

  1. 您無法確定表達式的類型。
  2. 您看不到其他文件的內容。 (雖然可以節省用於處理文件後)

這意味着你不能執行一些代碼檢查 功能,是在先進的IDE像IntelliJ IDEA的使用。對於 示例,您將無法執行檢查,發現多餘的 類型轉換或未使用的公共方法。

因此,您無法檢查實例java是否正在調用具有Locale替代方法的一種方法。您可以使用您不允許調用的方法黑名單。因此,例如調用新的FileWriter()會檢查傳遞的參數數量等。

0

我認爲Annotation Processor更適合這項任務。從Matthew Farwell's answer「您無法確定表達式的類型。」

假設您使用包含擴展FileWriter類的FancyWriter的第三方jar。您非法將x = new FancyWriter () ;置入您的代碼中。 CheckStyle不會找到它,因爲它使用正則表達式,並且它不夠聰明,無法知道FancyWriter是FileWriter。我認爲你可以編寫一個註釋處理器來計算FancyWriter實際上是一個FileWriter並且是非法的。

另外,有人 - 理論上 - 可以寫一個非法類的擴展,消除系統依賴。例如,假定FileWriter有一個獲取系統編碼的方法。如果LegalWriter擴展FileWriter並覆蓋該方法,那麼我們不應該拒絕LegalWriter只是b/c它擴展了一個非法類。

如果您使用第三方罐子,他們的課程將如何合法。僅僅因爲他們不擴大非法班級,並不意味着他們不使用它。那麼如果你使用他們的一個類,你的代碼是依賴於系統的。

0

由於Matthewemory指出,沒有一個完美的解決方案與檢查風格。這裏是我的建議:

  • 不要只禁止一些構造函數,而是禁止受影響的類的所有構造函數。然後創建你自己的子類,它隱藏了禁止的構造函數。例如,創建一個檢查樣式「FileWriter\(」和一個子類SystemIndependentFileWriter只有一些超類的構造函數。
  • 創建模式「toLowerCase()」,並希望沒有人創建具有相同名稱的方法。 Or use FindBugs to catch this one.
  • 創建一個檢查樣式「Calendar.getInstance()」。我沒有看到那個問題。

希望它只會拋出一些誤報,可以放在忽略列表中。最終你需要調整它來捕捉換行符或其他錯位的空格。

相關問題