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

How to simplify multiple same looking enumerations?

我得到了多个枚举,它们都实现了相同的接口 AnimationSet,但有更多的字段,例如文件名,每个枚举都必须实现完全相同的 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>>> 其中第一个列表对应于枚举和一组动画,第二个列表包含组中的所有动画,第三个列表(带图像)代表一个特定动画中的所有图像。
稍后我可以从这个列表中获取外部图像。

现在我正在寻找一种方法来simplify/shorten这段代码(方法和字段都是一样的)。

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

能不能帮忙想个简单的办法

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

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