Java使用接口共享枚举之间的通用功能

时间:2017-09-11 14:23:16

标签: java enums interface abstract

我有一些枚举具有相同的功能,但出于组织原因包含不同的常量。它们看起来都像这样:

public enum OneEnum { 
    greenApple(apple, green),
    redApple(apple,red);

    private final String fruit;
    private final String type;

    private OneEnum (final String fruit, final String type) {
        this.fruit = fruit;
        this.type = type;
    }

    public String getFruit() {
        return fruit;
    }

    public String getType() {
        return type;
    }
}

其他枚举具有相同的私有字段,构造函数和方法,只有列出的常量不同。我想知道这些代码有多少我可以移动到一个常见的地方,如接口(如果可能的话,抽象类)。我能够创建一个界面,如:

public interface CommonEnum {
    String getFruit();
    String getType();
}

但我可以做得更好吗?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

public interface CommonEnum { ...

public class Holder implements CommonEnum() {
 private final String fruit ...

}

public enum OneEnum {
  GREEN_APPLE(new Holder(GREEN, APPLE)), ...

  private OneEnum(Holder holder) { this.holder = holder };

  public getHolder() { return holder };

换句话说:如果值的“组合”是您在不同地方需要的“常见事物”,那么 应该进入自己的类。

当然,其缺点是:你的枚举用户现在违反了德米特定律,如:

Fruit fruit = OneEnum.GREEN_APPLE.getHolder().getFruit();

答案 1 :(得分:0)

我根本没有看到使用枚举来表达价值组合的重点。

你有效的是

public enum Fruit {
    APPLE, ORANGE, BANANA //...
}

public enum Color {
    RED, GREEN, BLUE // ... 
}

和两者的组合

class ColoredFruit {
    public final Fruit fruit;
    public final Color color;
    public ColoredFruit(Fruit f, Color c) { fruit = f; color = c; }
}

您拥有的枚举只是实例

Collection<ColoredFruit> apples = Arrays.asList(new ColoredFruit(APPLE, RED), new ColoredFruit(APPLE, GREEN));

如果您确实感到喜欢,请添加界面

interface Fruit {
    FruitEnum getFruit();
}
interface Colored {
    Color getColor();
}

ColoredFruit可以通过添加getter来实现。