2014-10-19 72 views
0

我正在開發一個使用Java的Play Framework 2應用程序,我想知道是否可以使用靜態幫助器類。在Play Framework 2中使用靜態幫助器類是一個好主意嗎?

例如,我想知道用戶是否已登錄並完成其配置文件。此測試需要幾行,可能會有所變化,並且在應用程序中使用很多。

因此,我用一個方法用一個參數(Session對象)編寫了一個帶有這些測試的類,我使用它到處都是。

但我必須每次實例化一個類才能使用該方法,因此在規模上可能效率不高。將它設爲靜態是否安全?如果是這樣,我可以安全地將其他播放對象用作參數嗎?

+1

你爲什麼要實例化一個類來使用該方法?這個功能當然聽起來像是成爲靜態方法的強有力候選人。它是否安全......誰知道......我們不知道這個方法做了什麼!還有哪些其他物體可以安全使用...我不知道,我不完全確定你的擔憂是什麼... – Neilos 2014-10-19 22:12:18

+0

我的問題是:我必須檢查以確保靜態方法(不在一個控制器)在線程安全的框架?在這方面,在這種情況下使用哪些播放對象(如Request,Session ...)是安全的?這是一個普遍的問題,關於做什麼和不該做什麼,做什麼是最好的方式。 – Romain 2014-11-01 21:18:50

回答

0

當你說「測試」時,我假設你是指一些檢查邏輯,而不是單元測試。

在這種情況下,您可以使用依賴注入而不是靜態助手。

https://www.playframework.com/documentation/2.3.x/JavaInjection

上面的鏈接顯示瞭如何使用Guice處理請求時注入控制器的例子。

所以以前你的控制器會是:

public class Application extends Controller { 

    public static Result index() { 
     if (YourStaticHelper.yourStaticMethod.isOk()) { 
      return ok("It works!"); 
     } 
     else { 
      return forbidden("NO"); 
     } 
    } 

} 

現在,它會變成:

public class Application extends Controller { 

    @Inject 
    YourStaticHelperInterface checker; 

    public Result index() { // no longer static 
     if (checker.isOk()) { 
      return ok("It works!"); 
     } 
     else { 
      return forbidden("NO"); 
     } 
    } 

} 

所不同的是在前面的一個,如果你以某種方式需要新的幫手,你就必須改變控制器代碼使其適應變化,而在第二種情況下,您只需要在運行時注入一個不同的實現,就像isOk()那樣在接口中成爲契約。

好處?誰知道。如果我在家裏自己寫一些東西,或者控制器代碼實際上與幫助程序緊密耦合,我會選擇第一個。如果我在公司工作,我會選擇第二個。這完全是關於軟件工程狗屎,但這是事情的工作原理。

+0

有趣的答案,即使它不是我所期望的。 – Romain 2014-11-01 21:23:08

相關問題