2016-07-30 48 views
1

我看到有時類中不依賴實例狀態的方法被標記爲static。我發現它很明顯,它宣稱'這種方法獨立於實例狀態'。當審查狀態不一致的機會時,完全忽略該方法是很容易的。不讀取/寫入實例狀態的標記方法

但是,將靜態方法標記爲靜態方法的問題是無法繼承或覆蓋靜態方法。

像這樣的事情在這裏討論:Does it make sense to have a non static method which does not use an instance variable?

會是有意義的有一個註釋來聲明非靜態方法是狀態無關?然後編譯器可以驗證它只使用其他獨立於狀態的方法。

管道中是否有這樣的功能?

+1

當然會。這就是爲什麼C++有* const *的原因。也許你想檢查是否有人在java社區過程中發出請求;如果不;啓動它;-)但嚴重 - * static *上的另一個視圖是:這是OO內的異常。除了你提到的問題之外,靜態調用還會導致更緊密的耦合;和更難測試的代碼。所以重點是:你儘可能避免它。 – GhostCat

+1

@GhostCat請注意,這與C++ const不同,這基本上提出了可覆蓋/虛擬靜態方法。 – hyde

+0

@hyde是的......當我向方法傳遞兩個參數並獲得一個返回值時,有時候我想確保(1)該方法僅使用這個類中的這兩個輸入,(2)它不以任何方式改變狀態。 – Teddy

回答

1

java中沒有這樣的機制。即使是static也不涵蓋所有情況。靜態方法仍然可以在靜態上下文中改變狀態。

class Example { 
    static int counter = 0; 
    static int add(int a, int b) { 
     counter++; 
     return a + b; 
    } 
} 

但是有一些研究使用靜態分析來解決這個問題。看起來像JPure有一個工作原型

+0

非常感謝。這幾乎就是我正在尋找的東西。我想知道爲什麼它不是Java核心語言功能。我希望它能在某些時候融入到語言中。順便說一句,你會有這樣的建議:http://stackoverflow.com/questions/23995683/improvement-of-package-private-classes-in-java – Teddy

+0

是的,這將是有用的功能。馬丁奧德斯基在他的演講中提到了斯卡拉路線圖,在未來的某個時間點,它將具有將在函數簽名中編碼副作用的效果系統。但我根本不期望在java中有這樣的改變。 –

+0

我一直在望着斯卡拉這麼久。我想我應該嘗試一下。當您不必查看代碼的一部分時,我就喜歡它,因爲它標記爲安全。同樣的原因,我們喜歡使用Immutable集合,或標記字段最後等謝謝。 – Teddy