traitでapplyを実装して、初期化処理を共通化したくなりました。
要件としては、Identifier[_]
を継承したIDクラスを引数なしでapply
すると値が自動生成されてほしい。
以下のようにすると、できた気がする
trait Identifier[+A] {
def value: A
}
trait StringIdentifierCompanion[A <: Identifier[_]] {
def prefix: String
def apply(value: String): A
def apply(): A = this.apply(this.generateId)
def generateId: String = s"${prefix}-${UUID.randomUUID.toString}" // WIP
}
final case class UserId(value: String) extends Identifier[String]
case object UserId extends StringIdentifierCompanion[UserId] {
override def prefix: String = "USER"
}
StringIdentifierCompanionのtraitでdef apply(value: String): A
が定義されていますが、UserIdのコンパニオンオブジェクトなので、メソッドが自動生成され、わざわざ定義しなくても動く。