初歩的な質問かもしれませんが、以下のような状況に困っています。
現在kotlinにて実装しているのでサンプルはkotlinになりますが、回答はJavaでも問題ありません。
オブジェクト指向として?正しい実装はどれか教えてください。
現在の実装
Userクラスがあります。
kotlin
1class User { 2 val condition: Condition = Condition() 3 4 fun grow() { 5 condition.age++ 6 condition.height++ 7 condition.weight++ 8 } 9}
UserのプロパティであるConditionクラスは以下です。
kotlin
1class Condition { 2 var age: Int = 0 3 var height: Int = 0 4 var weight: Int = 0 5}
Conditionクラスでは年齢、身長、体重をプロパティとしていて、Userクラスのgrow()メソッドにて年齢、身長、体重が1ずつ上がっていきます。(普通に考えると変ですが。。。)
困っていること
このときにMainクラスでUserクラスをインスタンス化して運用したいのですが、MainクラスからConditionの値が直接変更されてしまいます。
kotlin
1class Main { 2 val user: User = User() 3 4 fun main() { 5 // getはされてもよいと考えている 6 val age = user.condition.age 7 8 // setはさせたくない 9 user.condition.age = 100 10 } 11}
user.conditionを変更することはできません。(valとしているので)
しかし、user.condition.ageを変更することができてしまいますので、これを制止したいです。
いわゆるConditionクラスの値を、Userクラス内では自由に変更できるが、その外からは読み取り専用というようにしたいと考えています。
考えたこと
Conditionクラスをやめる
Userのプロパティに年齢などを持たせて、val とすることで、当たり前ですが上記の実現したいことができると考えています。そもそもクラス設計がおかしい、というのであればこの案に最終的にはたどり着くかと考えています。
Conditionクラスをコピーして渡す
UserクラスのConditionのgetterメソッドを加工して、別の実態を渡す。そうすればそのConditionクラスの値を書き換えられない気がする。(なんとなくです)
ほかにもval をvarに変えるなど考えましたがなかなか納得のいく実装になりませんでした。
考え方、正しい実装を教えていただきたく思います。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー