如何在设置属性值之前和之后存储对象状态

时间:2015-07-31 07:48:57

标签: scala getter-setter case-class scala-2.11

我有一个类Demo我想在设置属性值之前保存对象值这里是我的代码

case class Demo (var abc:String)

      val d =Demo("bob")
      var oldDemo=d
      d.abc="joe"

      println("old name is "+oldDemo.abc +" the new name is "+d.abc)

控制台上打印的输出是

old name is joe the new name is joe

我想在设置d.abc="joe"之前存储对象值,以便在bob时获得oldDemo.abc 请指导我哪里出错了什么,以及实现目标的正确方法。如果我做一些愚蠢的话,我道歉

3 个答案:

答案 0 :(得分:3)

您可以在案例类上使用copy()

val d1 = Demo("abc")
val d2 = d1.copy()
d1.abc = "def"

// d2 : Demo = Demo(abc)
// d1 : Demo = Demo(def)

更多Scala惯用方法是使用不可变的案例类:

case class Person(name: String, age: Int)
val bob = Person("Bob", 30)
val joe = bob.copy(name="Joe")

// bob : Person = Person(Bob,30)
// joe : Person = Person(Joe,30)

答案 1 :(得分:2)

  1. afaik,案例类是不可变的。
  2. 案例类很便宜,因此不可变的案例类可能符合您的要求。
  3. 如果更改了可变对象,则对该对象的引用将无法帮助您存储以前的状态。为此,您需要该对象的副本。
  4. 因此,根据您的要求,我会复制原始对象,将选择属性更改为qasi变异

    case class Demo(abc: String)
    
    val demo = Demo("foo")
    val quasiMutatedDemo = demo.copy(abc = "bar")
    

    或者我必须在我的可变类中实现一个副本(仅仅因为我永远不会让自己创建一个可变的case类)。

    class Demo(var abc: String) {
      def copy: Demo = new Demo(this.abc)
    }
    
    val demo = new Demo("foo")
    val odlDemo = demo.copy
    val mutatedDemo = demo.abc = "bar"
    

答案 2 :(得分:1)

实现这一目标的最佳方法是不使用可变变量。像

case class Demo(abc: String)

val d = Demo("bob")
val newDemo = d.copy(abc = "joe")

println("old name is " + d.abc + " the new name is " + newDemo.abc)