枚举与常量 java_java – 为什么两个枚举常量可以在同一行中使用?

我将尝试在上述评论中添加更多内容.

枚举值有些特殊.从Java枚举的Wikipedia条目开始:

An enum type in Java is actually a special compiler-generated class rather than an arithmetic type, and enum values behave as global pre-generated instances of that class. Enum types can have instance methods and a constructor (the arguments of which can be specified separately for each enum value).

因此,虽然它们仅在编译时生成一次,但它们是给定枚举类型的特殊实例.因此,它可以访问该类的其他成员.请注意,这也意味着您无法自己实例化枚举类型(即使用new).

From one instance of enum class you can access another instance of same enum class? Which I haven’t seen in normal Java class.

这在普通类中也是可能的,虽然不赞成,因为它没有提供任何实际好处,甚至可能导致问题和错误(通过NullPointerExceptions).

考虑以下两个类:

public class SomeClass

{

public final static int MODE = 1;

private String message;

public SomeClass(String message)

{

this.message = message;

}

}

public class Test

{

public static void main(String[] args)

{

SomeClass myObject = new SomeClass("bla");

System.out.println(myObject.MODE);

System.out.println(OtherClass.MODE);

}

}

这只会打印出来:

1

1

但是,假设您正在执行某些任务,其中您迭代SomeClass对象的列表,其中某些条目可能为null(可能是因为它们在某些时候从集合中删除,或者因为在插入时允许空条目为原因).

在这种情况下,如果您通过实例访问静态成员,您将获得NPE,而通过类本身访问它将按预期工作.

请注意,问题中描述的行为特定于枚举类型本身(即Currency.NICKLE.DIME …).有一种方法可以模仿这种行为,如下所示:

public class SomeClass

{

public static SomeClass REF; // not final anymore since 'this' must be the first line in a constructor call

public String message; // note this is public now

public SomeClass(String message)

{

this.message = message;

}

public void setRef() {

REF = this;

}

}

public class Test

{

public static void main(String[] args)

{

SomeClass myObject = new SomeClass("bla!");

System.out.println(myObject.REF);

System.out.println(SomeClass.REF);

myObject.setRef();

System.out.println(SomeClass.REF);

System.out.println(SomeClass.REF.message);

}

}

这将打印出来:

null

null

SomeClass@... // Object.toString() call

bla!

但是使用这种糟糕的技术和许多缺点绝对没有任何好处.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值