@keisuke_n で、JavaのenumならよくてScalaのEnumerationなら駄目というのはどういったケースなのかなあというのが疑問なのです。両方とも動的さでは大差ないはずなので、差が出るというのが想像できない。 #scala
2010-06-05 10:31:43@keisuke_n APIとして、sealed trait + case classの方がわかりやすいという点については同意します。ただ、[enum].[名前]がめんどくさいならimportすればいいのでは、と思わないでもないですが。 #scala
2010-06-05 10:33:10@keisuke_n いや、自分もEnumerationはあまり好みませんが、その理由に関して、誤解を含んでいるものがあるのではないか、という疑問があるので聞いています。結論が同じであっても、論拠に疑問があるのです。
2010-06-05 10:35:40@kmizu 1.objectだから継承される心配はないはわかりました, 2.定数としてidを取りたいはシリアライズしたいときや比較などで取りたいわけです。これはタイミングによってNullPointerExceptionなどが発生します(lazy valで解決することもある)。
2010-06-05 10:38:48@kmizu Javaのenumは動的であっても、表面上は静的に動いているように見えるんですが、ScalaのEnumerationはそうじゃありません。タイミング次第で平気でNullPointerExceptionなどが発生します。
2010-06-05 10:39:54@kmizu [enum].[名前]はやっぱりださいでしょ。もともとCぽいenumをみんな想像してるのでJavaのもちょっと、と思います。static importは最後の手段なんでいまいち。
2010-06-05 10:40:39@keisuke_n 2.について、シリアライズ絡みで何か問題が発生し得る、ということで了解しました。シリアライゼーション絡みなら何か不具合があってもおかしくはなさそう。
2010-06-05 10:42:27@kmizu あともう1点。sealedほげほげは明確に型付けができます。これが大きい。Enumerationよりもわかりやすいし、変数に代入(型推論じゃない場合)するときもまよいがない。
2010-06-05 10:43:14@keisuke_n タイミングってのが何を指すか、ですね。javapしたコード見る限りでは、staticイニシャライザで初期化コード動かしてるので、その後のタイミングでぬるぽが発生するのはちょっと考えづらい気もするのですが…。 #scala
2010-06-05 10:47:29@keisuke_n 明確に型付けとは、どういう意味でしょうか。object A extends Enumeration { } と object B extends Enumeration { } でA.ValueとB.Valueは異なる型として区別されますよね。#scala
2010-06-05 10:49:28@kmizu EnumerationのValueの話、もともとGenericsを使うケースではないし、ユーザがその型は何かが非常にわかりにくくなります。sealedほげは継承した型そのものなんでわかりやすいですよね?Erasureも排除したいですし。
2010-06-05 10:55:30@kmizu タイミングはThreadなどが絡んだときに発生しているように見えます。たぶんScalaのバグではないかと思うのですが、原因はわかりません。ちなみにTL上で同じような現状にあっている人が何人かいます。
2010-06-05 10:56:25@kmizu ほかに、ScalaのEnumerationが定数ではないおかげでコンパイルできないケースが存在します。ただいまコードを出せないのですが...。
2010-06-05 10:57:53@keisuke_n いやいや、ジェネリクスは関係ありませんよ。A.ValueとB.Valueは単に別の列挙型として区別される(A.Value型の変数にB.Value型の値を代入したり、その逆ができない)というだけの話です。これ自体はわかりにくい話でも無いと思いますが…。
2010-06-05 10:58:11@kmizu えーわかりにくいよー。だいたいScalaでわかりにくいと言っているのはGenerics関係なんで、Genericsが必要ないものにたいして無理してGenericsを使う意義がまったくわかりません。
2010-06-05 10:59:10@keisuke_n いや、だからジェネリックスは使ってないんですってば。A.Valueという型とB.Valueという型がある。ただそれだけです。
2010-06-05 11:00:05@kmizu たぶん @kmizu のレベルからするとそうなのかもしれないけど、一般的にGenericsは敬遠されます。私は一般以上のプログラマをあてにしていないので(まぁそもそもScalaだときびしいわけですが)、どう考えてもEnumerationは不利です。
2010-06-05 11:00:11まあ、裏側の話をすると、あれはパス依存型を利用して実現されているので、まあややこしいといえばややこしいのだけど、ユーザは単に異なるEnumeration.Valueの型には互換性が無い、ということだけを知っておけばよい。
2010-06-05 11:01:24@kmizu それがダメでしょ。 < ユーザは単に異なるEnumeration.Valueの型には互換性が無い、ということだけを知っておけばよい。 | 「必要以上にわかりやすくすんな」が私の意見。
2010-06-05 11:03:33@keisuke_n 一応、用語の整理をしておきます。Java/Scalaで言うジェネリクスって、G<T>とかG[T]みたいに型をパラメータに取る型のことですよね?少なくとも、その意味では、scala.Enumerationはジェネリクスを使っていないです。
2010-06-05 11:03:39@keisuke_n うーん。それに関しては、Javaのenumと同じですよね?Javaのenumのそれは良くて、Enumeration.Valueに関して同じようになっているのが何故まずいのでしょうか。
2010-06-05 11:04:41@kmizu Genericsうんぬんはたんなる勘違いのようですね。あと型付けの話をまったくしてませんよね?
2010-06-05 11:07:18