在单独的文件中为每个枚举定义方法

时间:2013-03-09 15:06:10

标签: java enums

我正在寻找一种能够为每个枚举实例定义方法的方法。我们都知道本页底部的代码构造。

我正在寻找的差异是能够在一个经过验证编译时的单独文件中为每个枚举定义一个或多个抽象方法。意思是如果有人要添加另一个枚举实例,我会得到一个编译时错误而不是运行时错误,这是我在本页底部的结构所得到的。

请求的原因是在某些代码中我看到有很多方法应该按枚举定义,但实际上与枚举定义无关,所以我想将它们放在单独的文件中但不丢失解决这个问题的“标准”方式的好处。

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);

}

2 个答案:

答案 0 :(得分: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与方法分开 - 如果有人未向MyEnumCallback的构造函数提供Enum的实现,也会抛出编译时错误实例

答案 1 :(得分: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();
    }
}
相关问题