2015-04-02 87 views
0

我試圖不可改變的地圖內保持文檔類的列表:在這種情況下,我需要不可變的Map嗎?

object DocumentModel extends App{ 

    case class Document(title : String , text : String) 


    val documentMap = Map[org.joda.time.DateTime , Document]() 


    def addDocument(d : Document) : Map[org.joda.time.DateTime , Document]= { 
    documentMap + (new org.joda.time.DateTime -> d) 
    } 

    addDocument(Document("title" , "text")) 

    println("size is "+addDocument(Document("title" , "text")).size); 


} 

當訪問documentMap它的大小是一致的一個,每次在方法addDocument返回的地圖只是附加元素相同的不可變集合。

如何追加到不可變的Map並返回它的值還是需要使用immutable Map?

更新:

一種選擇是使用:

object DocumentModel extends App{ 

    case class Document(title : String , text : String) 

    var id = Map[org.joda.time.DateTime , Document]() 

    def addDocument(d : Document) : Map[org.joda.time.DateTime , Document]= { 
    id = id + (new org.joda.time.DateTime -> d) 

    id 
    } 

    addDocument(Document("title" , "text")) 

    println("size is "+addDocument(Document("title" , "text")).size); 
    println("size is "+addDocument(Document("title" , "text")).size); 


} 

但這不是線程安全

+0

不變本身意味着它不能被改變意味着它不能被修改。在你的情況下,你只是返回一個新的地圖。使用var和不可變映射OR val和可變映射。 – curious 2015-04-02 09:45:45

回答

0

在你的代碼addDocument不改變documentMap成員的所有方法,它只是始終返回一個元素的新地圖。成員documentMap保持空白。

如果你想保持地圖的所有添加的文檔,你有兩個選擇:

要麼使用一個可變的地圖在val成員documentMap,或使用var成員documentMap有一個不變的地圖。

您選擇的方法取決於您打算如何使用地圖。如果你永遠不會返回整個地圖,那麼使用可變的地圖是可以的。如果您從某些公開方法返回地圖,那麼我會選擇var-模擬方法。

因爲您的方法addDocument返回地圖,所以我會使用var-模仿建議的模擬方法。

0

我要創建可變對象(DocumentModel)通過組合的印象不可變的對象(Map),這是行不通的。

第一種解決方案,如您所發現的,對documentMap使用可變的Map。你將因此得到一個可變的DocumentModel

val documentMap = mutable.Map[org.joda.time.DateTime , Document]() 

您可以使用您的可變DocumentModel方式如下:

val docs = DocumentModel() 
docs.addDocument("title1", "text1") 
docs.addDocument("title2", "text2") 
docs.addDocument("title3", "text3") 

第二種解決方案是在你的addDocument方法返回一個新的DocumentModel

def addDocument(d : Document) : Map[org.joda.time.DateTime , Document]= { 
    val newDocumentMap = documentMap + (new org.joda.time.DateTime -> d) 
    DocumentModel(newDocumentMap) 
} 

你會因此得到一個不變的DocumentModel,其使用方式不同:

val docs0 = DocumentModel() 
val docs1 = docs0.addDocument("title1", "text1") 
val docs2 = docs1.addDocument("title2", "text2") 
val docs3 = docs2.addDocument("title3", "text3") 

val docs = DocumentModel().addDocument("title1", "text1") 
          .addDocument("title2", "text2") 
          .addDocument("title3", "text3") 
+0

對於第二種解決方案是否意味着DocumentModel需要應用方法? :DocumentModel(newDocumentMap) – 2015-04-02 10:04:54

+0

您需要有一個構造函數,它將一個不可變映射作爲參數 – Xion345 2015-04-02 11:14:01

相關問題