私のコードベースでは、私はvars
から屈折する必要があります。コードベース構造は次の形式に従います。スカラ:valからvalへの再設計
class Animal {
var name : Option[String] = None
var owner : Option[String] = None
}
case class Dog(breed: String) extends Animal {
//Dog logic
}
この設計の主な理由は、情報がすべて同時に利用可能でないことです。
ので、JSONをデシリアライズservice A
から、私はAnimal
(Animal
、Dog
のいずれか)
val animal = new Animal
animal.name = "My little animal"
、その後
def update(animal: Animal) : Unit {
animal match {
case a : Animal => a.owner = Some("Joe") // call to service B
case _ => //handle dog
}
}
update(animal)
を受ける質問は:どのように私はそれを再設計することができますAnimal
の可変状態を避ける?
は
Animal
でcopy
方法を書きますか?複数のフィールドがあり、いくつかの定型文を生成する可能性があります。構成?
2クラスを作るcase
?
case class Animal (...)
case class Dog(animal: Animal, breed: String)
編集私はDogs
とAnimals
(本当にAnimal
とnoサブタイプを持つことになりますと、私はまだ、Animal
の具体的な実装を必要とするtrait
として
- アニマル)
- コピー
の問題の場合、クラスのコピーメソッドに建てられ、
Animal
クラスの値を更新しません。したがって、私が望むものではなく、デフォルト値が使用されます。 - はい、すべてのフィールドでケースクラスを作成することは可能ですが、100以上のフィールドがある場合は実用的ですか?
ケースクラスには、コピーメソッドが含まれています。https://stackoverflow.com/questions/7249396/how-to-clone-a-case-class-instance-and-change-just-one-field-in-scala – ameer