getClass() 在枚举中使用构造函数时打印二进制格式
getClass() prints binary format while using constructor in Enum
我正在学习枚举可以为我们提供的各种选项。我已经了解了其中的构造函数、方法和重写方法。
代码示例如下。
不过我有一个问题。
在这种情况下,getClass()
returns class enumData.WeekEnumElaborate
, enumData.WeekEnumElaborate
等等,直到 enumData.WeekEnumElaborate
但是,当枚举是一个简单的枚举时,只声明常量,getClass()
returns 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();
}
这是我正在测试的 class。
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());
}
}
}
当您为枚举提供与外部枚举不同的行为时 class,您实际上是在定义一个匿名静态内部 class,它是基本枚举 [=] 的子class 16=].
这些嵌套 classes 的名称的命名方式与匿名内部 classes 的命名方式相同。即外 class + $ + counter.
这允许每个枚举对相同的签名有不同的方法实现。
您目前正在您的 enum
定义中定义匿名内部 类,这是我在要求您 not 写时所指的部分像这样的代码。详细来说,我实现你原来的 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[=10=]("R[=10=]", "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();
}
}
不需要匿名 类,它明显更短且更容易推理。
我正在学习枚举可以为我们提供的各种选项。我已经了解了其中的构造函数、方法和重写方法。
代码示例如下。
不过我有一个问题。
在这种情况下,getClass()
returns class enumData.WeekEnumElaborate
, enumData.WeekEnumElaborate
等等,直到 enumData.WeekEnumElaborate
但是,当枚举是一个简单的枚举时,只声明常量,getClass()
returns 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();
}
这是我正在测试的 class。
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());
}
}
}
当您为枚举提供与外部枚举不同的行为时 class,您实际上是在定义一个匿名静态内部 class,它是基本枚举 [=] 的子class 16=].
这些嵌套 classes 的名称的命名方式与匿名内部 classes 的命名方式相同。即外 class + $ + counter.
这允许每个枚举对相同的签名有不同的方法实现。
您目前正在您的 enum
定义中定义匿名内部 类,这是我在要求您 not 写时所指的部分像这样的代码。详细来说,我实现你原来的 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[=10=]("R[=10=]", "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();
}
}
不需要匿名 类,它明显更短且更容易推理。