Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Kotlin的数据类中保存旧数据_Android_Kotlin_Data Class - Fatal编程技术网

Android 如何在Kotlin的数据类中保存旧数据

Android 如何在Kotlin的数据类中保存旧数据,android,kotlin,data-class,Android,Kotlin,Data Class,我试图使用一个数据类,但我不知道如何正确保存数据 我创建了一个数据类: data class SavedValue( var currentValue:String, var previousValue:String = "") 我想要的是每次我想要保存一个新的currentValue,已经保存的current的值将复制到previousValue,新的currentValue覆盖currentValue字段 感谢您的帮助Kotlin中的数据类不应该提供此类功能,因为它们是为保存数据而设计

我试图使用一个数据类,但我不知道如何正确保存数据

我创建了一个数据类:

  data class SavedValue( var currentValue:String, var previousValue:String = "")
我想要的是每次我想要保存一个新的
currentValue
,已经保存的
current
的值将复制到
previousValue
,新的
currentValue
覆盖
currentValue
字段


感谢您的帮助

Kotlin中的数据类不应该提供此类功能,因为它们是为保存数据而设计的
您可以只使用一个简单的类。
然而,您可以实现您想要的(有或没有数据类),但是您必须在类内移动
currentValue
,并使用setter(和getter)。
在其位置上使用
私有
属性,如
\u currentValue

data class SavedValue(private var _currentValue: String, var previousValue: String = "") {
    var currentValue: String
        get() = _currentValue
        set(value) {
            previousValue = _currentValue
            _currentValue = value
        }
}
此代码:

val sv = SavedValue("abc")
println("currentValue = ${sv.currentValue} and previousValue = ${sv.previousValue}")
将打印:

currentValue = abc and previousValue = 
currentValue = ABC and previousValue = abc
这是:

sv.currentValue = "ABC"
println("currentValue = ${sv.currentValue} and previousValue = ${sv.previousValue}")
将打印:

currentValue = abc and previousValue = 
currentValue = ABC and previousValue = abc
另外,我认为您需要
previousValue
作为只读属性,对吗?
因此,也将其移动到类中,并使其setter
私有化:

data class SavedValue(private var _currentValue: String) {
    var _previousValue: String = ""

    var currentValue: String
        get() = _currentValue
        set(value) {
            previousValue = _currentValue
            _currentValue = value
        }

    var previousValue: String
        get() = _previousValue
        private set(value) {
            _previousValue = value
        }
}

使用数据类,您试图实现的目标并不是直接的。相反,您可以使用POJO类并使用自定义setter和getter

class SavedValue(currentValue: String, previousValue: String) {
private var _currentValue: String = currentValue
private var _previousValue: String = previousValue

var currentValue: String
    get() {
        return _currentValue
    }
    set(value) {
        _previousValue = _currentValue
        _currentValue = value
    }

   override fun toString(): String {
       return "SavedValue(_currentValue='$_currentValue', 
      _previousValue='$_previousValue')"
   }
}

第一个解决方案工作正常,但如果不希望第三个字段仅保存当前值,则可以执行以下操作:

data class SavedValue(var previousValue: String = "") {
    var currentValue: String = ""
        set(value) {
            if (field != value) previousValue = field
            field = value
        }
}
例如

产出:

I/System.out:当前:初始值-上一个:
I/System.out:当前:第二个值-上一个:初始值
I/System.out:当前:第三个值-上一个:第二个值
或者,如果需要不可变的previousValue,则需要第三个字段:

data class SavedValue(private var _previousValue: String = "") {
    var currentValue: String = ""
        set(value) {
            if (field != value) _previousValue = field
            field = value
        }
    val previousValue: String
        get() = _previousValue
}

在设置新的当前值之前,应覆盖
currentValue
setter并设置以前的值。