2

各列挙型インスタンスのメソッドを定義できる方法を探しています。このページの下部にあるコード構成については、誰もが知っています。

私が探している違いは、コンパイル時に検証される個別のファイルで、列挙型ごとに1つ以上の抽象メソッドを定義できることです。つまり、誰かが別の列挙型インスタンスを追加した場合、このページの下部にある構造で発生する実行時エラーではなく、コンパイル時エラーが発生します。

リクエストの理由は、私が見ているコードの中には、列挙型ごとに定義する必要があるメソッドがたくさんあるが、列挙型の定義とは実際には無関係であるため、それらを別々のファイルに配置したいのですが、これを解決する「標準的な」方法。

public enum MyEnum {
X {
    public void calc(Outer o) {
        // do something
    }
},
Y {
    public void calc(Outer o) {
        // do something
    }
};

// abstract method
abstract void calc(Outer o);

}

4

2 に答える 2

0

クラス外のクラスにメソッドを定義することはできません!

各列挙型インスタンスが次のインスタンスを持つ必要があるコールバック インターフェイスを定義できます。

public interface MyEnumCallback {
  doStuff(final Outer o)
}

次に、列挙型は次のようになります

public enum MyEnum {
  X(new XCallback()),
  Y(new YCallbaxk());

  private final MyEnumCallback callback;

  public MyEnum(final MyEnumCallback callback) {
     this.callback = callback;
  }

  public <Whatever> call(final Outer o) {
     callback.doStuff(o);
  }
}

これにより、必要に応じてメソッドから分離されます。誰かがインスタンスのコンストラクターにEnum実装を提供しなかった場合、コンパイル時エラーもスローされます。MyEnumCallbackEnum

于 2013-03-09T15:15:12.503 に答える
0

次のコードを検討してください。

interface Delegate{
    void calc();
}

enum TestEnum {

    EnumValue1(new Delegate() {
        @Override
        public void calc() {

        }
    }),

    EnumValue2(new Delegate() {
        @Override
        public void calc() {

        }
    });

    private Delegate delegate;

    TestEnum(Delegate d){
        this.delegate = d;
    }

    public Delegate getDelegate() {
        return delegate;
    }
}

public class Test {
    public static void main() {
        TestEnum.EnumValue1.getDelegate().calc();
        TestEnum.EnumValue2.getDelegate().calc();
    }
}
于 2013-03-09T15:18:34.597 に答える