uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

enumはインスタンスベースオブジェクト指向の夢を見るか

Javaenumは、ご存知のようにクラスの特殊なものです。その実体は、複数個数のシングルトンすなわち「N-ton」のさらに特別な場合としての、クラス初期化時に固定個数が生成される(サブクラスの)インスタンスの集合ですね(あとそれにプラスして多少の言語機能のサポートと利便のためのsyntheticメソッド群がぼちぼちと)。

でね、あえてこの世界でプログラミングができるかを挑戦したくなるわけですよ。クラス定義をいっさい使わずに、enumだけでプログラムを組む。つまりenum指向プログラミングですね。

動的にインスタンスが生成できない?とか言われると、あらかじめ確定個数のインスタンスしか存在しない事が分かっていればプログラミングできるってことじゃない?とかに執念を燃やすとかね。

それに加えて、Groovyならインスタンス毎のメタクラスenumインスタンスにメソッド注入してやればいいじゃないか!*1どのぐらい自由度が上がるのか?!とか、興味深くないっすか?*2

と思ったのが1月ぐらい。でもちょっと試してみて当時のGroovyのenumはあまりにもバギーだったので入り口からあきらめました。そのときに、いくつか(これこれ)バグを発見したので報告はしてみました。

enumのバグにはまっている方がいらっしゃったので思い出したようにアイデアだけ書いておきます。Groovy 1.8でいくつかは直ってるようなので、今度再挑戦してみよう。

*1:というよりも、Javaにおいて、インスタンスごとのメタクラス(特異メソッド)がenumで実現されている気もする。

*2:すんません、思いつきです。興味深くないかも。