首页 > 解决方案 > 用函数初始化Java枚举属性?

问题描述

我在 Java 8 中有一个带有 Lombok 的枚举,@Getter@AllArgsConstructor用于枚举值的附加属性:

@Getter
@AllArgsConstructor
public enum MyEnum {
    RED(1),
    GREEN(2),
    BLUE(3),
    PURPLE(4);
    
    private final int ordinal;
    
    public String getDisplayName() {
        switch (ordinal) {
            case 1:
                return "1st color";
            case 2:
                return "2nd color";
            case 3:
                return "3rd color";
            default:
                return "another color";
        }
    }
}

我不喜欢这个解决方案的地方:getDisplayName()经常调用,因此每次调用都会运行 switch-case 语句。

是否可以添加另一个属性,例如displayName由类似于的函数设置的值getDisplayName()

像这样的东西(伪代码):

@Getter
@AllArgsConstructor
public enum MyEnum {
    RED(1, setDisplayName()),
    GREEN(2, setDisplayName()),
    BLUE(3, setDisplayName()),
    PURPLE(4, setDisplayName());
    
    private final int ordinal;
    private String displayName;
    
    private void setDisplayName() {
        switch (ordinal) {
            case 1:
                displayName = "1st color";
            case 2:
                displayName = "2nd color";
            case 3:
                displayName = "3rd color";
            default:
                displayName = "another color";
        }
    }
}

标签: java

解决方案


如果你没有和龙目岛结婚,我只会提供我自己的构造函数,让它完成繁重的工作

@Getter
public enum MyEnum {
    RED(1),
    GREEN(2),
    BLUE(3),
    PURPLE(4);
    
    private final int o;
    private final String display;
    
    private MyEnum (int o) {
        this.o = o;
        switch (o) {
            case 1:
                display = "1st color";
                break;
            case 2:
                display = "2nd color";
                break;
            case 3:
                display = "3rd color";
                break;
            default:
                display = "another color";
        }
    }
}

也根据@hfontanez 的建议更改ordinal为。o


推荐阅读