java枚举:概念怀疑
以枚举为例:java枚举:概念怀疑,java,enums,Java,Enums,以枚举为例: enum day{ MONDAY, TUESDAY}; 星期一、星期二是什么。sun文档说它们是特殊类类型enum中的字段。但是,如果是这样,我们为什么可以这样做: day d=day.MONDAY 我的意思是,我们如何将一个类常量赋给一个类变量。您正在将字段的值赋给一个新字段。这与: public class Constants { public static final String FOO = "foo"; } public class Other {
enum day{ MONDAY, TUESDAY};
星期一、星期二是什么。sun文档说它们是特殊类类型enum中的字段。但是,如果是这样,我们为什么可以这样做:
day d=day.MONDAY
我的意思是,我们如何将一个类常量赋给一个类变量。您正在将字段的值赋给一个新字段。这与:
public class Constants {
public static final String FOO = "foo";
}
public class Other {
String x = Constants.FOO;
}
enum只是另一种引用类型,只是它碰巧有一些库支持,enum的唯一实例(撇开一些粗俗的攻击不谈)是enum值引用的实例。您正在将字段的值分配给一个新字段。这与:
public class Constants {
public static final String FOO = "foo";
}
public class Other {
String x = Constants.FOO;
}
enum只是另一种引用类型,只是它碰巧有一些库支持,并且enum的唯一实例(撇开一些粗俗的攻击不谈)是由enum值引用的实例。您始终可以将类常量指定给类变量。考虑:
public class ConstantClass
{
public static String constantString = "I am a constant";
}
include ConstantClass;
public class OtherClass
{
private String regularVariable;
public OtherClass()
{
regularVariable = ConstantClass.constantString;
}
}
与常规类一样,这也适用于枚举类型。您始终可以将类常量指定给类变量。考虑:
public class ConstantClass
{
public static String constantString = "I am a constant";
}
include ConstantClass;
public class OtherClass
{
private String regularVariable;
public OtherClass()
{
regularVariable = ConstantClass.constantString;
}
}
与常规类一样,这也适用于枚举类型。类似于@Jon的建议,但更具体地说 编辑:我添加了Enum为您提供的一些方法。我希望这有助于
public class Day /* extends Enum */ {
public static final Day MONDAY = new Day("MONDAY", 0);
public static final Day TUESDAY = new Day("TUESDAY", 1);
private static final Day[] values = { MONDAY, TUESDAY };
private static final Map<String, Day> valueOfMap = new HashMap();
public static Day[] values() { return values.clone(); }
public static Day valueOf(String name) {
Day day = valueOfmap.get(name);
if(day == null) throw new IllegalArgumentException(name);
return day;
}
private final String name;
private final int ordinal;
private Day(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
valueOfMap.put(name, this);
}
public String name() { return name; }
public int ordinal() { return ordinal; }
public String toString() { return name; }
}
public class Other {
Day day = Day.MONDAY;
}
public class Day/*扩展枚举*/{
公共静态最后一天星期一=新的一天(“星期一”,0);
公众静态最后一天星期二=新的一天(“星期二”,1);
私有静态最后一天[]值={星期一、星期二};
私有静态最终映射值OfMap=newHashMap();
公共静态日[]值(){return values.clone();}
公共静态日值(字符串名称){
Day Day=valueOfmap.get(名称);
如果(day==null)抛出新的IllegalArgumentException(name);
回归日;
}
私有最终字符串名;
私有最终整数序号;
私人日(字符串名称,整数序号){
this.name=名称;
this.ordinal=序数;
valueOfMap.put(名称,此);
}
公共字符串名称(){return name;}
public int ordinal(){return ordinal;}
公共字符串toString(){return name;}
}
公共类其他{
Day=Day.MONDAY;
}
这可能不是如何实现它,而是如何实现它。像@Jon的建议,但更具体地说 编辑:我添加了Enum为您提供的一些方法。我希望这有助于
public class Day /* extends Enum */ {
public static final Day MONDAY = new Day("MONDAY", 0);
public static final Day TUESDAY = new Day("TUESDAY", 1);
private static final Day[] values = { MONDAY, TUESDAY };
private static final Map<String, Day> valueOfMap = new HashMap();
public static Day[] values() { return values.clone(); }
public static Day valueOf(String name) {
Day day = valueOfmap.get(name);
if(day == null) throw new IllegalArgumentException(name);
return day;
}
private final String name;
private final int ordinal;
private Day(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
valueOfMap.put(name, this);
}
public String name() { return name; }
public int ordinal() { return ordinal; }
public String toString() { return name; }
}
public class Other {
Day day = Day.MONDAY;
}
public class Day/*扩展枚举*/{
公共静态最后一天星期一=新的一天(“星期一”,0);
公众静态最后一天星期二=新的一天(“星期二”,1);
私有静态最后一天[]值={星期一、星期二};
私有静态最终映射值OfMap=newHashMap();
公共静态日[]值(){return values.clone();}
公共静态日值(字符串名称){
Day Day=valueOfmap.get(名称);
如果(day==null)抛出新的IllegalArgumentException(name);
回归日;
}
私有最终字符串名;
私有最终整数序号;
私人日(字符串名称,整数序号){
this.name=名称;
this.ordinal=序数;
valueOfMap.put(名称,此);
}
公共字符串名称(){return name;}
public int ordinal(){return ordinal;}
公共字符串toString(){return name;}
}
公共类其他{
Day=Day.MONDAY;
}
这可能不是如何实现它,而是如何实现它。星期一和星期二是由enum语句定义的类的实例 以下是一个例子:
enum dow
{
MONDAY(1),
TUESDAY(2);
private int value;
private dow(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
星期一和星期二是由enum语句定义的类的实例 以下是一个例子:
enum dow
{
MONDAY(1),
TUESDAY(2);
private int value;
private dow(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
@乔恩:在枚举中,我们似乎在做常量x=常量。FOO@TimeToCodeTheRoad:这只是因为变量的类型恰好与用于获取值的类型相同。想象一下,如果String有一个空的常量字段,那么写
String x=String.EMPTY
,就可以了,不是吗?@Jon:彼得的帖子似乎非常准确。这是后面的邮局yours@TimeToCodeTheRoad:这取决于您使用的排序顺序:)但是是的,这很好-尽管枚举提供了更多的功能,如ordinal
等@Jon:为什么枚举秩{1,2}会产生编译时间error@Jon:在枚举中,我们好像在做常数x=常数。FOO@TimeToCodeTheRoad:这只是因为变量的类型恰好与用于获取值的类型相同。想象一下,如果String有一个空的常量字段,那么写String x=String.EMPTY
,就可以了,不是吗?@Jon:彼得的帖子似乎非常准确。这是后面的邮局yours@TimeToCodeTheRoad:这取决于您使用的排序顺序:)但是,是的,这很好-尽管枚举提供了更多的功能,如ordinal
等@Jon:为什么枚举秩{1,2}会产生编译时错误更准确地说,星期一和星期二是枚举类型的字段;它们的值是对该类型实例的引用。我总是喜欢区分引用和实例:)更准确地说,星期一和星期二是枚举类型的字段;它们的值是对该类型实例的引用。我总是喜欢区分引用和实例:)