IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Effective Java 読書会 9 日目 「Enum の拡張とアノテーション」

はじめに

Effective Jav... - 告白 - はてなセリフ

今日読んだところ

160 ページ〜 174 ページ

enum は継承できない

混乱するので、あまり出来ないほうがいいけどね!

オペコードのようなものは

インタフェースを切って enum が継承してやれば拡張可能に出来るよ!
たとえば、 jythonバイトコード

package org.python.bytecode;

public interface Instruction {

    void accept(BytecodeVisitor visitor);
}

って感じのインタフェースを以下の enum で実装してる

package org.python.bytecode;

public enum BytecodeInstruction implements Instruction, RawInstruction {
    /** Marks the end of the byte code segment. */
    STOP_CODE(0, false, null, null) {

        /* ... */

        @Override
        public void accept(BytecodeVisitor visitor) {
            visitor.visitStop();
        }
    },

    /**
     * Remove the top stack element.
     *
     * Stack: element -> -
     */
    POP_TOP(1, false, null, null) {

        @Override
        public void accept(BytecodeVisitor visitor) {
            visitor.visitPop();
        }
    },

    /* ... */
}

なので、自分でオリジナルなバイトコードも追加できるということ

Class#getEnumConstants

T.values と同じだけどインスタンスメソッドなので、型消去後も使える。

命名パターンは、ダメ

アノテーションを使おう、命名パターンだと書き間違えとかあるしね。

Override アノテーションは付ける

いろいろ便利
オーバーライドしたつもりが、シグネチャの違いでオーバーロードになっちゃってるときが結構ある。
@Override で解決さ!

マーカーインタフェースは便利

タイプアノテーションも便利だけど、場合によってはマーカーインタフェースもまだ使う
マーカーインタフェースが便利なのは以下のようなとき

  • メソッドがマーク付けしたクラスだけを受け取りたいとき
  • 永久的にこのマーカーを適用させたい場合

まとめ

なんか、あっさり目な内容でした。
あ、アノテーション愛が足りない><