如何简化多个相同的枚举?

时间:2015-02-04 10:36:07

标签: java interface enums

我有多个枚举,它们都实现了相同的接口AnimationSet,但是有一些更多的字段,比如filename,每个枚举必须实现完全相同的getFilename()。

interface AnimationSet{
    String getPath();
    String getFilename();
}

public enum HammerAnimationSet implements AnimationSet{
    ONE("1"),
    TWO("2"),
    THREE("3"),
    FOUR("4");

    private static String path = "hammer/";
    private String filename;

    private HammerAnimationSet(String filename){
        this.filename = filename;
    }

    public String getFilename(){
        return filename;
    }

}

public enum ShopAnimationSet implements AnimationSet{
    HEART("heart"),
    MANA("mana bottle"),
    LUCK("clover");

    private static String path = "shop/";
    private String filename;

    private ShopAnimationSet(String filename){
        this.filename = filename;
    }

    public String getFilename(){
        return filename;
    }

}

编辑:我现在使用这些枚举填充List<List<List<Image>>>,其中第一个列表对应枚举和一组动画,第二个列表包含组中的所有动画,第三个列表(带图像) )表示一个特定动画中的所有图像 稍后我可以从这个列表中获取外部图像。

现在我正在寻找一种简化/缩短此代码的方法(方法和字段都是相同的)。

我想过一个超类,但那是不可能的,因为枚举已经扩展了Enum。我还考虑过将枚举更改为类,但我想保留枚举值。我也想过一个抽象的界面,但我想到的是不可能的。

你能否帮助思考一种实现简化的方法。

1 个答案:

答案 0 :(得分:2)

您可以考虑使用委托而不是继承:

public class AnimationSet {
    private final String path, filename;

    public AnimationSet(String path, String filename) {
        this.path = path;
        this.filename = filename;
    }
    public String getPath() {
        return path;
    }
    public String getFilename(){
        return filename;
    }
}

public enum HammerAnimationSet {
    ONE("1"),
    TWO("2"),
    THREE("3"),
    FOUR("4");

    final AnimationSet animationSet;

    HammerAnimationSet(String filename) {
        animationSet=new AnimationSet("hammer/", filename);
    }
    public AnimationSet getAnimationSet() {
        return animationSet;
    }
}

public enum ShopAnimationSet {
    HEART("heart"),
    MANA("mana bottle"),
    LUCK("clover");

    final AnimationSet animationSet;

    private ShopAnimationSet(String filename){
        animationSet=new AnimationSet("shop/", filename);
    }
    public AnimationSet getAnimationSet() {
        return animationSet;
    }
}

因此AnimationSet的功能可以扩展,而无需调整任何enum