0
votes

Comment enregistrer d'anciennes données dans une classe de données dans Kotlin

J'essaie d'utiliser une classe de données, mais je n'arrive pas à comprendre comment enregistrer correctement les données.

J'ai créé une classe de données:

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

Ce que je veux, c'est que chaque fois que je souhaite enregistrer une nouvelle currentValue , la valeur déjà enregistrée pour current est la copie dans previousValue et la nouvelle currentValue écrase le champ currentValue .

Merci pour l'aide


1 commentaires

Vous devez remplacer le paramètre currentValue et définir la valeur précédente avant de définir la nouvelle valeur actuelle.


3 Réponses :


1
votes

Une classe de données dans Kotlin n'est pas censée fournir de telles fonctionnalités, car elles sont conçues pour contenir des données.
Vous pouvez simplement utiliser une classe simple.
Néanmoins, vous pouvez réaliser ce que vous voulez (avec ou sans classe de données), mais vous devrez déplacer currentValue à l'intérieur de la classe et utiliser un setter (et un getter).
À sa place, utilisez une propriété private comme _currentValue:

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

Ce code:

currentValue = ABC and previousValue = abc

imprimera:

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

et ceci:

currentValue = abc and previousValue = 

imprimera:

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

De plus, je pense que vous avez besoin de previousValue comme propriété en lecture seule , n'est-ce pas?
Alors déplacez-le aussi dans la classe et rendez son setter privé :

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


0 commentaires

0
votes

Ce que vous essayez de réaliser n'est pas simple en utilisant la classe de données . À la place, vous pouvez utiliser la classe POJO et utiliser un setter et un getter personnalisés.

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


0 commentaires

0
votes

La première solution fonctionne bien, mais si vous ne voulez pas que le troisième champ contienne simplement la valeur actuelle, vous pouvez faire:

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

Par exemple

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


0 commentaires