有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

下面是代码示例

不过我有一个问题

在这种情况下,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());
    }

}

}


共 (2) 个答案

  1. # 1 楼答案

    当给外部枚举类赋予枚举不同的行为时,实际上是在定义一个匿名静态内部类,它是基本枚举类的子类

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

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

  2. # 2 楼答案

    您当前正在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();
        }
    }
    

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