我刚刚发现Java允许枚举实现接口。它的一个好的用例是什么?
当前回答
由于枚举可以实现接口,它们可以用于严格执行单例模式。试着让一个标准类成为单例允许…
获奖理由:可以使用反射技术将私有方法公开为公共方法 用于从你的单例中继承和用其他东西重写你的单例方法
作为单例的枚举有助于防止这些安全问题。这可能是让enum充当类并实现接口的原因之一。只是猜测。
更多讨论请参见https://stackoverflow.com/questions/427902/java-enum-singleton和java中的Singleton类。
其他回答
它是可扩展性所必需的——如果有人使用您开发的API,则您定义的枚举是静态的;它们不能被添加或修改。但是,如果让它实现一个接口,使用API的人可以使用相同的接口开发自己的枚举。然后,您可以向枚举管理器注册这个枚举,枚举管理器将枚举与标准接口结合在一起。
Edit: @Helper方法有一个完美的例子。考虑让其他库定义新的操作符,然后告诉管理器类“嘿,这个枚举存在——注册它”。否则,您只能在自己的代码中定义操作符——就没有可扩展性了。
例如,如果您有一个Logger enum。然后,在接口中应该有日志记录器方法,如debug、info、warning和error。它使您的代码松散耦合。
枚举不只是表示被动的集合(例如颜色)。它们可以表示具有功能的更复杂的对象,因此你可能想要在这些对象上添加更多的功能——例如,你可能有诸如Printable、Reportable等接口,以及支持这些接口的组件。
枚举就像Java类,它们可以有构造函数、方法等。唯一不能使用它们的是new EnumName()。实例是在枚举声明中预定义的。
上面提到的策略并没有充分强调使用枚举的策略模式的轻量级实现:
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读起来几乎像一种美味的松散类型语言!
推荐文章
- 在流中使用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