[解決済み] Kotlin データクラスのオーバーライドゲッター
質問
以下のKotlinのクラスがあるとする。
data class Test(val value: Int)
をどのようにオーバーライドすればよいのでしょうか?
Int
ゲッターをオーバーライドして、値が負の場合は 0 を返すようにするにはどうしたらよいでしょうか?
これが不可能な場合、適切な結果を得るためのテクニックは何でしょうか?
どのように解決するのですか?
ほぼ丸一年かけて毎日Kotlinを書いた結果、このようにデータクラスをオーバーライドしようとするのは悪い行為であることがわかりました。これには3つの有効なアプローチがあり、それらを提示した後に、他の回答が提案したアプローチがなぜ悪いのかを説明します。
-
を作成するビジネスロジックを用意する。
data class
を作成するビジネスロジックは、 コンストラクタを呼び出す前にその値を 0 以上に変更するようにします。 これはおそらくほとんどの場合において最良のアプローチでしょう。 -
を使用しないでください。
data class
. 通常のclass
を生成し、IDEにequals
とhashCode
メソッドを提供してくれます(必要ない場合は不要です)。確かに、オブジェクトのプロパティのいずれかが変更された場合は、それを再作成する必要がありますが、オブジェクトの完全な制御が残されています。class Test(value: Int) { val value: Int = value get() = if (field < 0) 0 else field override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is Test) return false return true } override fun hashCode(): Int { return javaClass.hashCode() } }
-
効果的にオーバーライドされるプライベートな値を持つ代わりに、望むことを行う追加の安全なプロパティをオブジェクト上に作成します。
data class Test(val value: Int) { val safeValue: Int get() = if (value < 0) 0 else value }
他の回答が示唆している悪いアプローチ。
data class Test(private val _value: Int) {
val value: Int
get() = if (_value < 0) 0 else _value
}
この方法の問題点は
データクラス
はこのようにデータを変更するためのものではないことです。それらは本当にデータを保持するためだけです。このようなデータクラスのゲッターをオーバーライドすることは、つまり
Test(0)
と
Test(-1)
ではありません。
equal
は互いに異なる
hashCode
を呼び出すと
.value
を呼び出すと、同じ結果になります。これは一貫性がなく、あなたにとってはうまくいくかもしれませんが、これがデータクラスであることを知ったあなたのチームの他の人々は、あなたがそれをどのように変更し、それが期待通りに機能しないようにしたかに気づかずに、誤ってそれを使用するかもしれません(例えば、このやり方は
Map
や
Set
).
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン