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
currentValueet définir la valeur précédente avant de définir la nouvelle valeur actuelle.