Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java枚举:概念怀疑_Java_Enums - Fatal编程技术网

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}会产生编译时错误更准确地说,星期一和星期二是枚举类型的字段;它们的值是对该类型实例的引用。我总是喜欢区分引用和实例:)更准确地说,星期一和星期二是枚举类型的字段;它们的值是对该类型实例的引用。我总是喜欢区分引用和实例:)