Scala の Enumeration について

@kmizu さんと @keisuke_n さんの Enumeration についての議論. @NetPenguin さんと @yasushia さんもちょっと関わっていたので発言を載せてあります.
2
前へ 1 2 ・・ 8 次へ
📙🔭✨NISHIMOTO Keisuke @keisuke_n

まぁ経験しないとわからんだろな。GUI関係は致命的に使えないので。

2010-06-04 14:16:02
📙🔭✨NISHIMOTO Keisuke @keisuke_n

というかぶれて書いてますよ。ぞろぞろと不具合があるわけですから、1つのことを言ってるわっけじゃありません > Enumeration

2010-06-04 14:18:10
kmizu @kmizu

@keisuke_n いやまあ、経験してないので実際わからないのです。とりあえず、後で例が出てから再度議論しましょうか。

2010-06-04 14:19:42
kmizu @kmizu

とりあえず、ScalaのEnumerationが不便な点、こちらがわかっている範囲で書いておくか。 #scala

2010-06-04 14:20:34
kmizu @kmizu

@keisuke_n いってらっしゃいませ。

2010-06-04 14:20:43
kmizu @kmizu

1.erasureによってA.Value(AはEnumerationを継承したオブジェクト)の型が、コンパイル後は単にEnumeration.Valueになってしまうので、JavaからEnumerationを利用する場合、不便。 #scala

2010-06-04 14:22:19
kmizu @kmizu

また、同じ理由で、異なるEnumerationを引数に取るメソッドのオーバーローディングができない。 #scala

2010-06-04 14:22:54
kmizu @kmizu

2.パターンマッチ時のチェックが効かない。sealed class + case classのときのように、書き漏らしたパターンを警告してくれない。これは原理的に仕方が無いけど。 #scala

2010-06-04 14:23:58
kmizu @kmizu

3.列挙型がパラメータを持てない。Javaのenumで言う、enum X { ... A(hoge), B(foo), C(bar) } みたいなのが書けない。これは、Enumerationをちょっと改造すればできないこともない。 #scala

2010-06-04 14:25:23
kmizu @kmizu

とりあえず、ぱっと思いつくのはこのあたり?

2010-06-04 14:25:36
kmizu @kmizu

@tmiya_ 私もscala.Enumerationはあまり好きじゃないですね。特に、パターンマッチ時のチェックが効かないのは地味に痛い…。 #scala

2010-06-04 14:33:59
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu もう移動中ですか?さっきの話、やはりErasureで不具合が出ることが多いのと、Swing使ってるときにvalで初期化されないケース(lazy valはおk)があって非常に使いにくかったのを思い出します。

2010-06-04 16:02:05
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu あと、sealed trait or sealed abstract class に比べると型を縛れないのでAPIとして公開するときにいろいろ不便です。それらの理由があって私はまったく使っていません。

2010-06-04 16:03:08
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu sealed型については、Scala特有のものであってJavaのenumにはないものですが、一端そういう使い方を知ってしまうとそれほど手軽じゃないEnumerationに魅力を感じなくなってますね。

2010-06-04 16:06:15
📙🔭✨NISHIMOTO Keisuke @keisuke_n

たぶんvalで変数を定義してるのに、初期化されていないケースはバグなんだろうなぁ。時間がなかったのではっきり調査していないけど。

2010-06-04 16:09:43
📙🔭✨NISHIMOTO Keisuke @keisuke_n

valで初期化されないケースはたぶんコンストラクタを定義していないときなんだと思う。確かそういうケースでダメだった。ああこれはEnumerationだけじゃないけど。

2010-06-04 16:11:37
📙🔭✨NISHIMOTO Keisuke @keisuke_n

暇があったら日記に書いておくか... > valで初期化されないケース

2010-06-04 16:13:02
📙🔭✨NISHIMOTO Keisuke @keisuke_n

ああ、もう1つ思い出した。Valueでidを取りたいときにidが定数じゃなかったのが残念だった。

2010-06-04 16:37:09
kmizu @kmizu

@keisuke_n もうすぐ搭乗ですが、少しだけ。その、型を縛れない、というのはどういう意図でしょうか?特定の列挙型のみしか入れられない、という制約はEnumerationでも可能ですよね。 #scala

2010-06-04 17:16:26
kmizu @kmizu

@keisuke_n Enumerationがそれほど好きではないというのは同意です。ただ、その理由の部分について、イマイチ納得しきれていないです。 #scala

2010-06-04 17:17:35
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu 他の方も言ってましたがクラスファイルが作られますしsealedはできませんよね。明示的な型ではない特別な型になるし、積極的に使う理由が見つかりません。基本的に私は実用的なものを好むのでEnumerationは必要ないですね。

2010-06-04 18:06:59
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu sealed型とEnumerationのprotectedなValueメソッドには違いがあって、後者は継承してしまうとどんどん取れてしまいます。基本的にAPIとして提供する場合にenum値をどんどん取って欲しくないケースには困ります。

2010-06-04 18:10:42
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu もちろん、Enumerationを継承したクラスをsealedすればいいでしょうけど、なんか素直な方法じゃないですよね。

2010-06-04 18:11:23
前へ 1 2 ・・ 8 次へ