2016-09-30 69 views
0

我在我的項目特點,我爲我的配置文件中使用,這樣的事情:在所有斯卡拉:基於用戶輸入初始化的性狀的VAL

trait config { 
    val people = Seq("John","Jessie") 
} 

這個特點是使用extends)我的對象(除了主要的)。我想這樣做是分配根據我從用戶main功能收到args不同的值,以people,所以我會碰到這樣的:

trait config { 
    val people = args.head match { 
     case "A" => Seq("John","Jessie") 
     case "B" => Seq("Bill","James","Brad") 
     case _ => Seq("Jimmy") 
}} 

有沒有辦法做到這一點?

+0

這是不太可能的配置類型數據的最佳模式的系統範圍的配置。你可能有一個包含你想要的任何配置數據的特徵,但是你必須包含它併爲每個對象填充它。這聽起來像是你想要定義配置數據已經存在的特性_所以你可以擴展它,而不必填充它,但這是不可能的。但是,如果你能做到這一點不會是一個壞主意,因爲這些數據不會被共享。每個對象中擴展它的實際對象都是不同的,效率不高。我會研究依賴注入。 –

+0

對不起,我在意外完成之前意外地發表了評論,因爲我顯然不擅長使用此編輯器。誰知道新線很難? :) –

+0

那麼將所有配置參數注入所有必需的對象和類的好方法是什麼? – shakedzy

回答

2

你問什麼是可能的:

trait config { 
    app: App => 

    lazy val people = args.head match { 
    case "A" => Seq("John","Jessie") 
    case "B" => Seq("Bill","James","Brad") 
    case _ => Seq("Jimmy") 
    } 
} 

object Main extends App with config { 
    people.mkString 
} 

,或者你可以減少特質,使其成爲其他類型的應用程序相比工作。

trait config { 
    protected def args: Array[String] 

    lazy val people = args.head match { 
    case "A" => Seq("John","Jessie") 
    case "B" => Seq("Bill","James","Brad") 
    case _ => Seq("Jimmy") 
    } 
} 

但是,正如已經指出的那樣,它不是一個好的模式。

如果你要提供你可能想看看Typesafe Config

+0

如何通過Typesafe預製我需要的操作? – shakedzy