Как сохранить старые данные в классе данных в Котлине - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь использовать класс данных, но не могу понять, как правильно сохранить данные.

Я создал класс данных:

  data class SavedValue( var currentValue:String, var previousValue:String = "")

Что я хочукаждый раз, когда я хочу сохранить новое currentValue, уже сохраненное значение для current копируется в previousValue, а новое currentValue перезаписывает поле currentValue.

Спасибо запомощь

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Класс данных в Kotlin не должен предоставлять такие функции, так как они предназначены для хранения данных.
Вы можете просто использовать простой класс.
Тем не менее, вы можете достичь того, что вы хотите (с или без класса данных), но вам нужно будет переместиться currentValue внутрь класса и использовать установщик (и получатель).
Вместо него используйте свойство private, например _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 = 

и это:

sv.currentValue = "ABC"
println("currentValue = ${sv.currentValue} and previousValue = ${sv.previousValue}")

напечатает:

currentValue = ABC and previousValue = abc

Кроме того, я думаю, что вам нужно previousValue как свойство только для чтения , верно?
Так что переместите его внутрь класса и сделайте его установщиком private:

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
        }
}
0 голосов
/ 05 июня 2019

Первое решение работает нормально, но если вы не хотите, чтобы третье поле просто содержало текущее значение, вы можете сделать:

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

Например

val savedValue = SavedValue()
savedValue.currentValue = "initial value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")
savedValue.currentValue = "second value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")
savedValue.currentValue = "third value"
println("current: ${savedValue.currentValue} - previous: ${savedValue.previousValue}")

Выходы:

I/System.out: current: initial value - previous:
I/System.out: current: second value - previous: initial value
I/System.out: current: third value - previous: second value

Или, если вам нужно неизменяемое значение предыдущего значения, вам понадобится третье поле:

data class SavedValue(private var _previousValue: String = "") {
    var currentValue: String = ""
        set(value) {
            if (field != value) _previousValue = field
            field = value
        }
    val previousValue: String
        get() = _previousValue
}
0 голосов
/ 04 июня 2019

То, что вы пытаетесь достичь, не просто, используя класс данных . Вместо этого вы можете использовать класс POJO и использовать пользовательский установщик и получатель.

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')"
   }
}
...