2014-01-17 30 views
11

是否有任何Checkstyle,PMD或Findbugs規則可以找到以下非線程安全的單例實現?查找非線程安全單例彈簧實現的代碼質量規則

private String helperVar; 

public String getValue(String value) { 
    helperVar = value; 
    return convertValue(); 
} 

private String convertValue() { 
    return helperVar.trim(); 
} 

我知道這個示例是可怕的,但它是顯示我的意思的最簡單的方法。

在一次執行中從bean執行getValue方法時,它會正常工作。 但是,在多用戶環境中執行它時,會導致不可預知的錯誤/行爲。

有沒有辦法找到這些發生而無需手動通過代碼?是否有任何靜態代碼檢查器可以自動檢查它和它的每個變化?

+0

一個字段的setter和'toString'基於該字段,連續調用,已經足夠了。毛骨悚然。 –

+1

感謝您試圖幫助我,但我沒有問題的代碼我只想自動找到相同模式的其他發生, 所以沒有任何問題與示例代碼有關。問題僅僅是關於可用的代碼檢查器。 – B4dT0bi

+1

我沒有批評代碼,但想要指出你的代碼模式,「改變一個字段並計算該字段的多次出現」_,是非常常見的。 –

回答

1

這可能不被您接受,但我有時會使用運行時間碼reflection來驗證代碼一致性。

對於您的使用案例,我會首先讓我所有的咖啡豆使用constructor爲基礎的注射,並使所有成員字段final。我相信findbugs甚至有一些不可變的bean檢查器。

第二要做你的用例的代碼一致性我會使用彈簧BeanPostProcessor或只是一個類實現ApplicationContextAware,然後走ApplicationContext。現在您只需檢查在您的應用程序上下文中加載的bean(只需檢查beans類的包名),以確保所有字段均爲final。是的,你需要一個更寬鬆的安全管理器,或者讓你的安全策略允許私有變量反射,但對於大多數情況來說,這並不是問題,特別是如果你已經使用了類似hibernate的東西。

如果有一個字段不是最終的,即無效的代碼,你只是拋出一個異常,你的Spring應用程序不會啓動。

對於規則的各種例外情況,您可以使用自定義註釋來獲取不必是最終的字段或需要忽略該規則的類。

您可能會擔心性能或者Spring構造函數注入功能不夠強大,但Spring在啓動時已經做了大量的反射,而且基於構造函數的注入在這些日子裏變得相當強大,甚至可以做屬性位置持有者值爲@Value(${PROP})

1

您可以

FindBugs library

它在方法的一些嘗試構建。

沒有確切的需求,但可以根據需要進行擴展。這是很好的例子

Daniel Schneller blog

探測器的總體思路是找到某些模式一類的字節碼。爲此,它將讀取.class文件,並將它們通過使用訪問者模式實現的模式匹配器。在閱讀它時會根據什麼元素(方法,字段聲明等)來調用適當的訪問者方法。編寫一個檢測器意味着實現一個或多個這些方法,建立一個關於這個類是什麼意圖的想法

好的是,最終它是你可以包含在你的測試模塊中的Java代碼。我想你也可以添加編譯器警告,但不確定。