2

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

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

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

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与您想要的方法分开 - 如果有人没有为实例MyEnumCallback的构造函数提供实现,它也会引发编译时错误。Enum

于 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 回答