Стоит помнить, что значения Enum являются объектами, а не int
значениями, как в других языках.Это позволяет вам использовать полиморфизм с ними, избавляя от необходимости использовать операторы switch во многих случаях.
interface IExample {
// you can use interfaces if you need them
void method1();
}
enum Example implements IExample {
ex1 {
public void method1() {
// do stuff
method2();
}
public void method2() {
// do other stuff
}
},
ex2 {
public void method1() {
// do stuff
method2();
}
public void method2() {
// do other stuff
method3(); // not all methods need to be different.
}
};
public abstract void method1(); // only needed if you don't use an interface
public abstract void method2(); // does it need to be public as well?
public void method3() { /* added as an example */ }
}
Нет необходимости генерировать исключение, поскольку ваш код не будет компилироваться, если вы забудете предоставить реализацию дляновое значение enum
.
IExample
может быть существующим интерфейсом или может потребоваться для расширения.например,
class Example2 implements IExample {
int x;
public Example2(int x) { this.x = x; }
public void method1() {
// uses x
}
}
Теперь вы можете написать
IExample e = Example.ex1; // fixed value
IExample e2 = new Example2(5); // extendable at runtime.
Зачем вы это делаете?
Есть пример, который я использую.
SystemTimeProvider - синглтон, реализованный как enum
SetTimeProvider класс, в котором каждый экземпляр может иметь различное фиксированное время для целей тестирования.