我刚刚发现Java允许枚举实现接口。它的一个好的用例是什么?
当前回答
这是我的理由……
我用Enum的值填充了一个JavaFX组合框。我有一个接口,可识别(指定一个方法:identify),它允许我指定任何对象如何为我的应用程序标识自己,以便进行搜索。这个接口使我能够扫描任何类型的对象(对象可能用于标识的任何字段)的列表以进行标识匹配。
我想在我的组合框列表中找到一个匹配的标识值。为了在包含Enum值的组合框上使用此功能,我必须能够在我的Enum中实现可识别接口(碰巧,在Enum的情况下实现是微不足道的)。
其他回答
由于枚举可以实现接口,它们可以用于严格执行单例模式。试着让一个标准类成为单例允许…
获奖理由:可以使用反射技术将私有方法公开为公共方法 用于从你的单例中继承和用其他东西重写你的单例方法
作为单例的枚举有助于防止这些安全问题。这可能是让enum充当类并实现接口的原因之一。只是猜测。
更多讨论请参见https://stackoverflow.com/questions/427902/java-enum-singleton和java中的Singleton类。
例如,如果您有一个Logger enum。然后,在接口中应该有日志记录器方法,如debug、info、warning和error。它使您的代码松散耦合。
枚举就像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);
另一个可能性:
public enum ConditionsToBeSatisfied implements Predicate<Number> {
IS_NOT_NULL(Objects::nonNull, "Item is null"),
IS_NOT_AN_INTEGER(item -> item instanceof Integer, "Item is not an integer"),
IS_POSITIVE(item -> item instanceof Integer && (Integer) item > 0, "Item is negative");
private final Predicate<Number> predicate;
private final String notSatisfiedLogMessage;
ConditionsToBeSatisfied(final Predicate<Number> predicate, final String notSatisfiedLogMessage) {
this.predicate = predicate;
this.notSatisfiedLogMessage = notSatisfiedLogMessage;
}
@Override
public boolean test(final Number item) {
final boolean isNotValid = predicate.negate().test(item);
if (isNotValid) {
log.warn("Invalid {}. Cause: {}", item, notSatisfiedLogMessage);
}
return predicate.test(item);
}
}
和使用:
Predicate<Number> p = IS_NOT_NULL.and(IS_NOT_AN_INTEGER).and(IS_POSITIVE);
推荐文章
- 在流中使用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