簡體   English   中英

如何在Kotlin中將舊數據保存到數據類中

[英]How to save old data in a data class in Kotlin

我正在嘗試使用數據類,但無法弄清楚如何正確保存數據。

我創建了一個數據類:

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

我想要的是每次我想要保存一個新的currentValue ,已經為current保存的值被復制到previousValue ,並且新的currentValue覆蓋currentValue字段。

謝謝您的幫助

Kotlin中的數據類不應提供此類功能,因為它們旨在保存數據。
您可以只使用一個簡單的類。
盡管如此,您可以實現所需的內容(使用或不使用數據類),但是您必須在類中移動currentValue並使用一個setter(和一個getter)。
代替使用_currentValue這樣的private屬性:

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
        }
}

您要實現的目標並非直接使用數據類 相反,您可以使用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
        }
}

例如

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

或者,如果您想使用非可變的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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM