目前我在玩遊戲框架很有趣,因爲這個框架承諾更快的開發。使用許多靜態函數是否有任何副作用?
當我看到代碼時,有這麼多的靜態代碼。即使控制器聲明爲靜態函數。因此,所有調用內部靜態函數的代碼都必須是靜態的?
我的問題是,這種方法是對的嗎?有沒有使用許多靜態功能的副作用?
目前我在玩遊戲框架很有趣,因爲這個框架承諾更快的開發。使用許多靜態函數是否有任何副作用?
當我看到代碼時,有這麼多的靜態代碼。即使控制器聲明爲靜態函數。因此,所有調用內部靜態函數的代碼都必須是靜態的?
我的問題是,這種方法是對的嗎?有沒有使用許多靜態功能的副作用?
面嚮對象語言中有關靜態方法的幾件事情:如果您選擇使用所有靜態方法,請嘗試解釋這些問題。
在面向對象的語言中,使用所有靜態函數可能不是慣用的。 您不能覆蓋子類中的靜態函數。因此,您將失去重寫運行時多態性的能力。
您定義的變量都會自動變爲類變量(因爲您的所有方法都是靜態的),所以基本上沒有任何與該實例相關聯的狀態。
靜態方法很難模擬。你可能需要像PowerMock這樣的框架來爲你嘲笑。所以測試變得困難。
設計變得有點複雜,因爲您將無法創建不可變類,因爲您只有類而沒有實例。所以設計線程安全類變得困難。
是的,使用太多靜態函數或變量會有副作用。 你應該避免不必要的靜態聲明。
因爲靜態成員總是在JRE中加載類時創建內存空間。即使你不創建類的對象,它也會佔用內存。
詳細說明我的評論。
靜態方法可以調用非靜態方法,前提是您擁有某個事物的實例。
class A {
public void nonStaticMethod() { }
public static void staticMethod(String text) {
// calls non-static method on text
text.length();
// calls non-static method on new Object
new Object().hashCode();
// calls non static method on a instance of A
new A().nonStaticMethod();
}
}
我明白你的意思,謝謝。我可以使用谷歌guice來創建對象實例,然後使用控制器中的非靜態函數 – indrap
此問題已被以前以類似的方式提出。簡單的答案是Play在合理的地方使用靜態。
HTTP模型不是OO模型。 HTTP請求本身是無狀態的,因此,靜態方法允許訪問控制器作爲來自客戶端代碼的功能請求。
另一方面,模型類是純粹的面向對象,因此不是靜態的重。 某些實用方法(如findAll或findById)是靜態的,但這些方法也不是有狀態的,並且是類中的實用方法。無論如何,我希望這是一個標準的OO模型。
因此,我認爲Play方式在做事方面沒有任何風險。這可能看起來很奇怪,因爲它挑戰規範,但是出於合理原因這樣做。
靜態方法可以調用作爲參數或靜態字段或它們創建的對象傳遞的實例的非靜態方法。它不能調用沒有實例的同一類的非靜態方法。 –
@Peter:請您詳細說明 – indrap