2012-07-03 47 views
1

我正在構建一個應用程序,該應用程序應該接受一個參數,指定要使用的給定數據結構的實現。比方說,參數的超類型是Super,並且我提供了許多SubX實現。在我的應用程序的用戶提供的SubY中,在編譯時並不知道。如何將類型參數傳遞給我的Scala應用程序?工廠是最好的解決方案嗎?

在應用程序中,參數將全部傳遞,並將用於創建Sub_的實例,調用Super中定義的方法,並在參數化類型中用作參數。

如果它僅用於參數化類型,我可以讓我的類也參數化,並且可以工作。然而,我需要創建這樣的對象的實例,所以我想知道什麼是配置我的應用程序的最佳方式。

我應該通過類型加工廠作爲參數嗎?我發現工廠模式很醜,並且想要避免這種方法。此外,傳遞的參數太多(我的應用程序實際需要幾個這樣的參數)。

我應該創建一個對象並在那裏粘貼這個配置嗎?對象對象是否可以在運行時解析,從而允許在編譯時不知道配置?

編輯:理想情況下,我想有像下面的代碼。你能提供一個基於此的最低工作示例嗎?

class Test[Type <: Super] { 
    def main { 
     val testVal: Type = new Type() 
     testVal.methodDefinedInSuper() 
    } 
} 

回答

2

使用工廠。如果它們太多並且你不想創建一個工廠工廠來統一它們,那麼使用依賴注入框架來實現它。依賴注入框架甚至支持XML配置,這似乎符合你想要做的事情。

如果您不知道任何依賴注入框架,請首先檢查您正在使用的任何框架是否已經提供,如果不符合,請檢查Google Guice

例有工廠:

trait Factory[T] { 
    def newInstance(): T 
} 

class Test[Type <: Super](typeFactory: Factory[Type]) { 
    def main { 
    val testVal: Type = typeFactory.newInstance() 
    testVal.methodDefinedInSuper() 
    } 
} 

實例與谷歌吉斯:

class Test[Type <: Super] { 
    @Inject val testVal: Type = _ 
    def main { 
    testVal.methodDefinedInSuper() 
    } 
} 

注意,這種風格注入對谷歌吉斯的建議是他們全部的最少。我已經使用它,因爲它也是最簡潔的,給出一個普遍的看法。

但是請注意,在任何情況下都沒有理由使用Type <: Super。這種結合不是獲得你什麼,所以你可以重寫它們是這樣的:

class Test(typeFactory: Factory[Super]) { 
    def main { 
    val testVal: Super = typeFactory.newInstance() 
    testVal.methodDefinedInSuper() 
    } 
} 

class Test { 
    @Inject val testVal: Super = _ 
    def main { 
    testVal.methodDefinedInSuper() 
    } 
} 

不管怎樣,在你傳遞的工廠作爲構造參數,第一種情況,而在第二種情況下,你使用的Guices綁定一個告訴Guice它應該使用什麼來初始化testVal

+0

丹尼爾,謝謝你的回答。現在對我來說這一切都很有意義。我需要'Type <:Super'出於其他原因,並且應該將它從這個例子中排除。 – lasaro

1

各地的傳遞與類型參數的對象和期待的東西基於該類型參數行不通的,因爲這些參數只在編譯時存在,因爲類型擦除不同的工作。

(OK,OK,你可以使用即將被棄用的體現,或者可能是新型標籤2.10,但應避免日常應用程序代碼這樣的巫術。)

相關問題