2011-09-14 38 views
6

目前我在玩遊戲框架很有趣,因爲這個框架承諾更快的開發。使用許多靜態函數是否有任何副作用?

當我看到代碼時,有這麼多的靜態代碼。即使控制器聲明爲靜態函數。因此,所有調用內部靜態函數的代碼都必須是靜態的?

我的問題是,這種方法是對的嗎?有沒有使用許多靜態功能的副作用?

+0

靜態方法可以調用作爲參數或靜態字段或它們創建的對象傳遞的實例的非靜態方法。它不能調用沒有實例的同一類的非靜態方法。 –

+0

@Peter:請您詳細說明 – indrap

回答

7

面嚮對象語言中有關靜態方法的幾件事情:如果您選擇使用所有靜態方法,請嘗試解釋這些問題。

在面向對象的語言中,使用所有靜態函數可能不是慣用的。 您不能覆蓋子類中的靜態函數。因此,您將失去重寫運行時多態性的能力。

您定義的變量都會自動變爲類變量(因爲您的所有方法都是靜態的),所以基本上沒有任何與該實例相關聯的狀態。

靜態方法很難模擬。你可能需要像PowerMock這樣的框架來爲你嘲笑。所以測試變得困難。

設計變得有點複雜,因爲您將無法創建不可變類,因爲您只有類而沒有實例。所以設計線程安全類變得困難。

+0

對於測試,Play Framework使用JUNIT4和Selenium。我認爲足以創建單元測試和迴歸測試 – indrap

+0

「因此,根據您的評論設計線程安全類變得困難」,在企業應用程序中使用play framework是不是很好? – indrap

+0

讓我澄清。設計一個不可變性的類是一種設計線程安全類的方法,而不必引入同步。當然,當你需要改變對象的狀態時,你必須創建一個新的類實例。例如看一下String類。但是如果你的方法都是靜態的,並且你擁有的只是類變量,那麼不可變類就沒有問題了,因爲沒有實例。我並不是說只有靜態方法的類纔是線程安全的。 – Aneesh

-3

是的,使用太多靜態函數或變量會有副作用。 你應該避免不必要的靜態聲明。

因爲靜態成員總是在JRE中加載類時創建內存空間。即使你不創建類的對象,它也會佔用內存。

+0

由於控制器使用靜態類,因此所有調用內部控制器的函數或類都必須是靜態的。我認爲在這種情況下,靜態使用是非常必要的。 – indrap

+3

這個答案是不正確的。靜態方法不會比實例方法多用或少用空間。不管這個班的實例是否成立,它都沒有區別。 –

+0

OP詢問靜態_functions_,而不是靜態_fields_。一旦類加載,靜態字段將分配空間,而實例字段在創建實例之前不會分配(但是,爲靜態字段分配的內存只分配一次,但實例字段爲_every_實例分配額外內存)。正如@stephenc所說,方法沒有區別。 – Chadwick

1

詳細說明我的評論。

靜態方法可以調用非靜態方法,前提是您擁有某個事物的實例。

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(); 
    } 
} 
+1

我明白你的意思,謝謝。我可以使用谷歌guice來創建對象實例,然後使用控制器中的非靜態函數 – indrap

17

此問題已被以前以類似的方式提出。簡單的答案是Play在合理的地方使用靜態。

HTTP模型不是OO模型。 HTTP請求本身是無狀態的,因此,靜態方法允許訪問控制器作爲來自客戶端代碼的功能請求。

另一方面,模型類是純粹的面向對象,因此不是靜態的重。 某些實用方法(如findAll或findById)是靜態的,但這些方法也不是有狀態的,並且是類中的實用方法。無論如何,我希望這是一個標準的OO模型。

因此,我認爲Play方式在做事方面沒有任何風險。這可能看起來很奇怪,因爲它挑戰規範,但是出於合理原因這樣做。

+4

這是正確的答案,因爲它專門針對Play框架。 – Ryan

+1

從Play Framework的食譜第15頁,它表明創建者很好地解決了這個問題(play.classloading。 enhancers.ControllerEnhancer) – indrap

+1

的確如此。 Guillaume非常聰明,Play團隊設計的Play結構非常好。 – Codemwnci

相關問題