2015-04-02 211 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

相关问题