Scala の enum についての議論
@keisuke_n いや、これは本気でわからないので聞いています。scala.Enumerationには別の意味でイマイチな点はあるのですが、指摘されている点は何かズレているのでは、という疑問を持っています。 #scala
2010-06-04 14:13:59@kmizu いやだから本人も思い出せないといってます。ただ今確認しているのは、静的に見えるけど実は動的にインスタンスが生成されているので、タイミング的に不具合が生じるケースを実際に経験しています。まずソレ。
2010-06-04 14:15:05というかぶれて書いてますよ。ぞろぞろと不具合があるわけですから、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@kmizu あと具体的なコードサンプルをだせないのですが、Value型で定数としてのid: Intを取りたかったのですが、タイミング的にいろいろダメなケースがあってどうも欲しいものじゃなくなりました。
2010-06-04 18:12:50