【问题标题】:getClass() prints binary format while using constructor in Enum [duplicate]getClass() 在枚举中使用构造函数时打印二进制格式 [重复]
【发布时间】:2019-05-24 06:00:49
【问题描述】:

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

代码示例如下。

我有一个问题。

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

}

}

【问题讨论】:

  • 不要写这样的代码。
  • @ElliottFrisch Oopsie doopsie...编辑了它
  • 不是二进制代码。这正是 Oracle Java 为合成成员命名的方式。
  • 不过,这是一个有趣的问题,而且我以前从未见过。 1+
  • 好吧,我承认这是一个棘手的问题,正如您从通常首先搜索重复项的知名用户那里得到答案的事实所证明的那样。不要为此感到难过——我知道要搜索什么,因为我知道答案。将像您这样的问题与副本相关联很重要,这样下一个人会更容易找到它!

标签: java enums classname


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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();
        }
    }
    

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

    【讨论】:

    • 好的。匿名课!!!我正在关注博客中的一个示例,该示例指出在每个定义的常量中使用此类方法比使用开关更好。我想知道我是否误解了它。顺便说一句,我了解到即使是我的练习代码也可以更简洁。
    • @Sara 博客作者发表了一个固执己见的声明,我的 if (this == MONDAY) 相当于switch(但我更喜欢 if 到 @987654328 @我自己,但现在我们严格地处于意见领域,更好变得主观)。
    • schneide.blog/2010/12/13/avoid-switch-use-enum 所以,我不必遵循那个?我知道这是固执己见;但是,如果我在我的项目中实施,是否会被视为一种不好的做法?
    • 这里没有开关或 if else cascade,并且像您最初发布的那样编写代码绝对是一种不好的做法。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多