枚举与常量 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!
但是使用這種糟糕的技術和許多缺點絕對沒有任何好處.
總結
以上是生活随笔為你收集整理的枚举与常量 java_java – 为什么两个枚举常量可以在同一行中使用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java二叉堆_为什么二叉堆利用数组存储
- 下一篇: json java 实例_java JS