getClass() 在 Enum 中使用构造函数时打印二进制格式



我正在学习枚举可以为我们提供的各种选项。我已经了解了其中的构造函数、方法和覆盖方法。

代码示例如下。

不过我有一个问题。

在这种情况下,getClass()返回类 enumData.WeekEnumElaborate$1enumData.WeekEnumElaborate$2 依此类推,直到enumData.WeekEnumElaborate$8

但是,当枚举是一个简单的枚举,只声明常量时,getClass()返回enumData.WeekEnumElaborate

请解释一下这个二进制符号。

这是我定义的枚举。

package enumData;
public enum WeekEnumElaborate {
    SUNDAY("SUN") {
        public String getDescription() {
            return this.getShortForm().concat(" Funday");
        }
    }, 
    MONDAY("MON") {
        public String getDescription() {
            return this.getShortForm().concat(" Moot");
        }
    };
    private final String shortForm;
    private WeekEnumElaborate(String shortForm) {
        this.shortForm = shortForm;
    }
    public String getShortForm(){
        eturn this.shortForm.toLowerCase();
    }
    public abstract String getDescription();
}

这是我正在测试的一个类。

package enumData;
public class TestWeekEnumElaborate {
public static void main(String[] args) {
    WeekEnumElaborate[] days = WeekEnumElaborate.values();
    for (WeekEnumElaborate day : days) {
        System.out.println(day.name());
        System.out.println(day.getClass());
        System.out.println(day.getDeclaringClass());
    }
}

}

当您为枚举类提供不同的行为时,您实际上是在定义一个匿名静态内部类,它是基枚举类的子类。

这些嵌套类的名称命名方式与匿名内部类的命名方式相同。即外部类 + $ + 计数器。

这允许每个枚举对同一签名具有不同的方法实现。

您当前正在enum定义中定义匿名内部类,这是我要求你不要编写此类代码时所指的部分。详细地说,我将实现您的原始enum的方式是这样的

public enum WeekEnumElaborate {
    SUNDAY("SUN", "Funday"), MONDAY("MON", "Moot"), TUESDAY("TUE", "Terrible"), 
    WEDNESDAY("WED", "Weed"), THURSDAY("THUR", "Terrific"), FRIDAY("FRI", "Fairy"),
    SATURDAY("SAT", "Jollyday"), R$00("R$00", "RX100 Day");
    private final String shortForm;
    private final String description;
    private WeekEnumElaborate(String shortForm, String description) {
        this.shortForm = shortForm;
        this.description = description;
    }
    public String getShortForm() {
        return this.shortForm.toLowerCase();
    }
    public String getDescription() {
        return new StringBuilder(getShortForm()).append(' ').append(this.description).toString();
    }
    public String getFurtherDescription(String desc) {
        if (this == MONDAY) {
            return "I do not want to work on this day!!!!";
        }
        return getDescription();
    }
}

不需要匿名类,而且它明显更短,更容易推理。

最新更新