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
3 Réponses :
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 } }
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')" } }
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
Vous devez remplacer le paramètre
currentValue
et définir la valeur précédente avant de définir la nouvelle valeur actuelle.