ScalaのEnumeration
クラスとEnumeration.Val
readResolve
メソッドは、(おそらくthis entry in Scala tracに関連する)動作するようには見えません。ここで問題説明するため*スティーブBendiola」が提供するプログラムです。Scala EnumerationとreadResolve
@serializable
object InvestmentType extends Enumeration {
val Debt = Value("DEBT")
val Future = Value("FUTURE")
val Equity = Value("EQUITY")
}
は今Main
それがファイルに列挙値を書き出しますarument W
のいずれかで実行することができ、クラス、またはR
それは、再びに戻ってそれらを読み込みます:
def foreach(os: ObjectInputStream)(f: Object => Unit) {
try {
val obj = os.readObject
if (obj != null) {
f(obj)
foreach(os)(f)
}
} catch {
case e: EOFException => //IGNORE
}
}
}
:
object Main {
def main(args: Array[String]) = {
args(0) match {
case "R" => {
val ois = new ObjectInputStream(new FileInputStream("enum.ser"))
var obj: Object = null
foreach(ois) { obj =>
obj match {
case InvestmentType.Debt => println("got " + obj)
case InvestmentType.Equity => println("got " + obj)
case InvestmentType.Future => println("got " + obj)
case _ => println("unknown: " + obj + " of: " + obj.getClass)
}
}
}
case "W" => {
val oos = new ObjectOutputStream(new FileOutputStream("enum.ser"))
InvestmentType.foreach {i => oos.writeObject(i)}
oos.flush
oos.close
}
}
}
これらのメソッドの両方がこのforeach
方法を必要としますこのプログラムの
出力は確かにない表情のようにする必要があります
got DEBT
unknown: FUTURE of: class scala.Enumeration$Val
unknown: EQUITY of: class scala.Enumeration$Val
列挙値が宣言されている注文した関連すると思われます。それらを並べ替えると、最初の値は常に分かりやすいように見えます。
Daniel - Scala Userのメーリングリストで述べたように、問題は* hashCodeと何も関係ありません。私はちょうど単一のJVMでEnumeration値の 'identityHashCode'を使って' Enumeration.Val'クラスの 'readResolve'メソッドが正しく動作していないことを示しています –
質問はあなたから来るのが簡単すぎました。 :-) はい私はそれを見ました。 –