我刚刚发现Java允许枚举实现接口。它的一个好的用例是什么?


当前回答

我在一个接口中使用了一个内部枚举来描述一个策略来保持实例控制(每个策略都是一个Singleton)。

public interface VectorizeStrategy {

    /**
     * Keep instance control from here.
     * 
     * Concrete classes constructors should be package private.
     */
    enum ConcreteStrategy implements VectorizeStrategy {
        DEFAULT (new VectorizeImpl());

        private final VectorizeStrategy INSTANCE;

        ConcreteStrategy(VectorizeStrategy concreteStrategy) {
            INSTANCE = concreteStrategy;
        }

        @Override
        public VectorImageGridIntersections processImage(MarvinImage img) {
            return INSTANCE.processImage(img);
        }
    }

    /**
     * Should perform edge Detection in order to have lines, that can be vectorized.
     * 
     * @param img An Image suitable for edge detection.
     * 
     * @return the VectorImageGridIntersections representing img's vectors 
     * intersections with the grids.
     */
    VectorImageGridIntersections processImage(MarvinImage img);
}

枚举实现该策略的事实便于允许枚举类充当其所包含的Instance的代理。其中也实现了接口。

它是一种strategyEnumProxy:P,客户端代码看起来像这样:

VectorizeStrategy.ConcreteStrategy.DEFAULT.processImage(img);

如果它没有实现接口,它将是:

VectorizeStrategy.ConcreteStrategy.DEFAULT.getInstance().processImage(img);

其他回答

这是我的理由……

我用Enum的值填充了一个JavaFX组合框。我有一个接口,可识别(指定一个方法:identify),它允许我指定任何对象如何为我的应用程序标识自己,以便进行搜索。这个接口使我能够扫描任何类型的对象(对象可能用于标识的任何字段)的列表以进行标识匹配。

我想在我的组合框列表中找到一个匹配的标识值。为了在包含Enum值的组合框上使用此功能,我必须能够在我的Enum中实现可识别接口(碰巧,在Enum的情况下实现是微不足道的)。

最常见的用法是将两个枚举的值合并到一个组中,并以类似的方式对待它们。例如,查看如何加入水果和蔬菜。

这里一些人给出的可比示例是错误的,因为Enum已经实现了这一点。你甚至不能重写它。

一个更好的例子是有一个定义数据类型的接口。你可以使用枚举来实现简单类型,也可以使用普通类来实现复杂类型:

interface DataType {
  // methods here
}

enum SimpleDataType implements DataType {
  INTEGER, STRING;

  // implement methods
}

class IdentifierDataType implements DataType {
  // implement interface and maybe add more specific methods
}

由于枚举可以实现接口,它们可以用于严格执行单例模式。试着让一个标准类成为单例允许…

获奖理由:可以使用反射技术将私有方法公开为公共方法 用于从你的单例中继承和用其他东西重写你的单例方法

作为单例的枚举有助于防止这些安全问题。这可能是让enum充当类并实现接口的原因之一。只是猜测。

更多讨论请参见https://stackoverflow.com/questions/427902/java-enum-singleton和java中的Singleton类。

例如,如果您有一个Logger enum。然后,在接口中应该有日志记录器方法,如debug、info、warning和error。它使您的代码松散耦合。