我刚刚发现Java允许枚举实现接口。它的一个好的用例是什么?
当前回答
上面提到的策略并没有充分强调使用枚举的策略模式的轻量级实现:
public enum Strategy {
A {
@Override
void execute() {
System.out.print("Executing strategy A");
}
},
B {
@Override
void execute() {
System.out.print("Executing strategy B");
}
};
abstract void execute();
}
你可以把所有的策略放在一个地方,而不需要为每个策略单独编译单元。你得到了一个很好的动态调度:
Strategy.valueOf("A").execute();
使java读起来几乎像一种美味的松散类型语言!
其他回答
上面提到的策略并没有充分强调使用枚举的策略模式的轻量级实现:
public enum Strategy {
A {
@Override
void execute() {
System.out.print("Executing strategy A");
}
},
B {
@Override
void execute() {
System.out.print("Executing strategy B");
}
};
abstract void execute();
}
你可以把所有的策略放在一个地方,而不需要为每个策略单独编译单元。你得到了一个很好的动态调度:
Strategy.valueOf("A").execute();
使java读起来几乎像一种美味的松散类型语言!
枚举不只是表示被动的集合(例如颜色)。它们可以表示具有功能的更复杂的对象,因此你可能想要在这些对象上添加更多的功能——例如,你可能有诸如Printable、Reportable等接口,以及支持这些接口的组件。
枚举就像Java类,它们可以有构造函数、方法等。唯一不能使用它们的是new EnumName()。实例是在枚举声明中预定义的。
有一个我经常用的箱子。我有一个IdUtil类的静态方法与对象一起工作,实现一个非常简单的可识别接口:
public interface Identifiable<K> {
K getId();
}
public abstract class IdUtil {
public static <T extends Enum<T> & Identifiable<S>, S> T get(Class<T> type, S id) {
for (T t : type.getEnumConstants()) {
if (Util.equals(t.getId(), id)) {
return t;
}
}
return null;
}
public static <T extends Enum<T> & Identifiable<S>, S extends Comparable<? super S>> List<T> getLower(T en) {
List<T> list = new ArrayList<>();
for (T t : en.getDeclaringClass().getEnumConstants()) {
if (t.getId().compareTo(en.getId()) < 0) {
list.add(t);
}
}
return list;
}
}
如果我创建一个可识别的enum:
public enum MyEnum implements Identifiable<Integer> {
FIRST(1), SECOND(2);
private int id;
private MyEnum(int id) {
this.id = id;
}
public Integer getId() {
return id;
}
}
然后我可以通过它的id得到它:
MyEnum e = IdUtil.get(MyEnum.class, 1);
枚举只是伪装的类,所以在大多数情况下,可以用类做的任何事情都可以用枚举做。
我想不出一个理由,enum不应该能够实现接口,同时我也想不出一个好的理由。
我想说的是,一旦你开始往枚举中添加接口或方法,你应该考虑把它变成一个类。当然,我确信有一些案例可以用于执行非传统枚举内容,而且由于限制是人为的,所以我赞成让人们在枚举中做他们想做的事情。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap