代数的データ型(ケースオブジェクト)を使用して、パターンマッチングで使用する型を表します。
sealed trait PrimitiveType
case object IntType extends PrimitiveType
case object LongType extends PrimitiveType
case object StringType extends PrimitiveType
...
def valueType(key: String): PrimitiveType = {
"NAME" => StringType
"AGE" => IntType
...
}
def read(db: Database, key: String): Unit = valueType(key) match {
case IntType => send(db.parseIntField(database, key))
case LongType => send(db.parseLongField(database, key))
case StringType => send(db.parseStringField(database, key))
...
}
しかし、あなたは知っている、既に存在しているInt
、Long
、String
、などScalaの中に。
これらを表すためにいくつかのケースオブジェクトを定義するのは無駄だと思います。
私は変更したいIntType
、LongType
、...にInt.type
、Long.type
または何でも私はパターンマッチングに使用することができます。
この場合、何が効率的ですか?
ありclassOf
、typeOf
、TypeTag
、ClassManifest
、...しかし、私はそれらの間の正確な違いを見ることができません。
私はScala2.11を使用しているのでTypeTag
、この場合に有効であれば問題ありません。
この場合(つまり、プリミティブ型のみを扱い、ジェネリックスは気にしない)、それらはすべて正常に機能します。新しいプロジェクトでマニフェストを使用しても意味がないことを除いて。例:タイプタグ付き:
import scala.reflect.runtime.universe._
val TypeTagString = typeTag[String]
def valueType(key: String): TypeTag[_] = {
"NAME" => TypeTagString
"AGE" => TypeTag.Int
...
}
def read(db: Database, key: String): Unit = valueType(key) match {
case TypeTag.Int => send(db.parseIntField(database, key))
case TypeTag.Long => send(db.parseLongField(database, key))
case TypeTagString => send(db.parseStringField(database, key))
...
}
ただし、元のデザインに戻って少し変更することを検討します。
sealed trait PrimitiveType[T] {
def parseField(db: Database, key: String): T
}
case object IntType extends PrimitiveType[Int] {
def parseField(db: Database, key: String) = db.parseIntField(key)
}
...
def read(db: Database, key: String): Unit = valueType(key).parseField(db, key)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加