我有一些枚举具有相同的功能,但出于组织原因包含不同的常量。它们看起来都像这样:
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();
}
但我可以做得更好吗?
答案 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来实现。