というかぶれて書いてますよ。ぞろぞろと不具合があるわけですから、1つのことを言ってるわっけじゃありません > Enumeration
2010-06-04 14:18:101.erasureによってA.Value(AはEnumerationを継承したオブジェクト)の型が、コンパイル後は単にEnumeration.Valueになってしまうので、JavaからEnumerationを利用する場合、不便。 #scala
2010-06-04 14:22:192.パターンマッチ時のチェックが効かない。sealed class + case classのときのように、書き漏らしたパターンを警告してくれない。これは原理的に仕方が無いけど。 #scala
2010-06-04 14:23:583.列挙型がパラメータを持てない。Javaのenumで言う、enum X { ... A(hoge), B(foo), C(bar) } みたいなのが書けない。これは、Enumerationをちょっと改造すればできないこともない。 #scala
2010-06-04 14:25:23@tmiya_ 私もscala.Enumerationはあまり好きじゃないですね。特に、パターンマッチ時のチェックが効かないのは地味に痛い…。 #scala
2010-06-04 14:33:59@kmizu もう移動中ですか?さっきの話、やはりErasureで不具合が出ることが多いのと、Swing使ってるときにvalで初期化されないケース(lazy valはおk)があって非常に使いにくかったのを思い出します。
2010-06-04 16:02:05@kmizu あと、sealed trait or sealed abstract class に比べると型を縛れないのでAPIとして公開するときにいろいろ不便です。それらの理由があって私はまったく使っていません。
2010-06-04 16:03:08@kmizu sealed型については、Scala特有のものであってJavaのenumにはないものですが、一端そういう使い方を知ってしまうとそれほど手軽じゃないEnumerationに魅力を感じなくなってますね。
2010-06-04 16:06:15たぶんvalで変数を定義してるのに、初期化されていないケースはバグなんだろうなぁ。時間がなかったのではっきり調査していないけど。
2010-06-04 16:09:43valで初期化されないケースはたぶんコンストラクタを定義していないときなんだと思う。確かそういうケースでダメだった。ああこれはEnumerationだけじゃないけど。
2010-06-04 16:11:37ああ、もう1つ思い出した。Valueでidを取りたいときにidが定数じゃなかったのが残念だった。
2010-06-04 16:37:09@keisuke_n もうすぐ搭乗ですが、少しだけ。その、型を縛れない、というのはどういう意図でしょうか?特定の列挙型のみしか入れられない、という制約はEnumerationでも可能ですよね。 #scala
2010-06-04 17:16:26@keisuke_n Enumerationがそれほど好きではないというのは同意です。ただ、その理由の部分について、イマイチ納得しきれていないです。 #scala
2010-06-04 17:17:35@kmizu 他の方も言ってましたがクラスファイルが作られますしsealedはできませんよね。明示的な型ではない特別な型になるし、積極的に使う理由が見つかりません。基本的に私は実用的なものを好むのでEnumerationは必要ないですね。
2010-06-04 18:06:59@kmizu sealed型とEnumerationのprotectedなValueメソッドには違いがあって、後者は継承してしまうとどんどん取れてしまいます。基本的にAPIとして提供する場合にenum値をどんどん取って欲しくないケースには困ります。
2010-06-04 18:10:42@kmizu もちろん、Enumerationを継承したクラスをsealedすればいいでしょうけど、なんか素直な方法じゃないですよね。
2010-06-04 18:11:23