列挙型は継承ができない

列挙型をいくつも作成して、そこに似たようなメソッドを定義していると、「列挙型も継承できたらいいのに」と思ってしまう。が、残念ながら、列挙型は継承ができない。それも当然で、abstract な列挙型なんてありえない。仕方ないなあ。

ただ、インタフェースの実装はできるので、これを活用するのが正解。

public interface Foo {
    public int getNumber();
}

というインタフェースを定義しておいて、

public enum FooEnum implements Foo {

ONE (1), TWO (2), THREE (3);
private int number;
private FooEnum (int arg0) { this.number = arg0; }
/* (non-Javadoc) * @see Foo#getNumber() */ @Override public int getNumber() { return number; } }

という感じで、列挙型を定義してあげる。

public class Sample {
    public static void main(String[] args) {
        for (Foo foo : FooEnum.values()) {
            System.out.println(foo.getNumber());
        }
    }
}

実際にこんな感じでインタフェースプログラミングができる。

Foo インタフェースを実装した列挙型を量産する際に、いちいちコンストラクタとフィールドを用意するのが、非常にかったるいわけだけど、その列挙型ではそこを意識しなくて良くなるから、それがせめてもの救い。

ちなみに、列挙型って1.xあたりでの java 育ちな人には、あんまり積極活用されていないような気がする。文化として根付かないのかな。スゴイ便利なんだけどなあ。

はてなはじまった

思うところあって、はてなダイアリーを始めました。

deftrash in hatena

最近、上流の仕事をする時間が増えて、技術的なところでないところで、いろいろと考えたり思ったりすることが多くなってきた。んで、そういうのは、はてなで話していた方が、まったりDISってもらえるんだろうな、と。

技術的な話題は、引き続きこっちに投下します。あ、Seasarネタは、はてなで。Seasarユーザーは、ひがさんの意見を伺えるだけで、はてな使う価値が十分にあると思う。「はてな駆動開発」というらしいのだけど、かかる時間と労力を考えると、超人的だ。

なるべくニッチな話題を集めて、一部の人がすごく助かるようなネタを提供できればと思っていますが、なかなか難しい。まあ、何か見つけたら更新というスタンスは変わらないです。よろしくおねがいします。

DUAL表の存在

/ db

Oracleでシーケンスを取得する際には

SELECT sequence.nextval FROM dual;

というように、DUAL表を使うのだけど、同じことを PostgreSQL で行う場合には、

SELECT nextval('sequence');

というように、FROM句なしで事足りてしまう。

両者の差は、方言だということで納得するしかないんだけど、やっぱりFROM句が無いというのは、違和感がある。もちろんこれはシーケンスの取得に限った話じゃなくて、全般的に。論理的な意味合いとして、「FROM句あってのSELECTじゃないの?」という気分。まあ、DUAL表にも意味はないわけで、「ムダなもんは排除しようよ」っていう流れは分かる。

まあ、あまりDBのコアな仕様を把握していないので、あまり尊大なことは言えない。FROM句の有無というインタフェースの問題以上に、内部では大きな差があるような気もするなあ。

javascriptでsubmitできない?

悔しいことにハマったので、メモ。

次のような感じで、javascriptでformをサブミットしようとしたら、エラーになってしまう。

<form name="addForm" action="/add" method="post">
<input type="button" name="submit" onclick="document.forms[0].submit()" value="送信" />
</form>

理由を聞いてみると、

document.forms[0].submit is not a function

関数じゃないって、そんなわけあるかい。javascriptの不審な動きに、仕方なくひとつひとつ探っていって、やっと分かりましたよ。formタグのなかに、「submit」という名前の要素を置くと、そっちを参照しちゃうみたい。ここでは、ボタンの名前に「submit」なんて付けているからダメだと。

言われてみれば、確かにそれはそれで正しい気がする。でも、まあ、もう少し優しい言葉を返してくれても良いんじゃないだろうか。同じ理由で、例えば、action や target という名前も、避けないといけないってことだよね。

回避策もありそうな気はするんだけどなあ。見つけたらエントリしまっす。


最新エントリー
列挙型は継承ができない
はてなはじまった
DUAL表の存在
javascriptでsubmitできない?
あわせて読みたいブログパーツ