java 枚举内嵌枚举_Java枚举益智游戏
java 枚舉內(nèi)嵌枚舉
假設(shè)我們有以下代碼: enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;private int valueDependsOnCounter;static {int sum = 0;for(int i = 0; i<10; i++) {sum +=i;}counter = sum;} Case() {this.valueDependsOnCounter = counter*counter;}}您認為編譯和運行代碼的結(jié)果是什么?
稍加思考。 (擾流塊)答案是按以下順序的第8個字母:bdcadcbabcad。
為了闡明這一點,有必要檢查以下內(nèi)容:
A.類中靜態(tài)初始化的順序:
B.構(gòu)造函數(shù)調(diào)用的順序(這也適用于靜態(tài)變量):
C.用Java表示枚舉對象的方式:
1)名稱E的枚舉除其他外具有一個隱式靜態(tài)最終字段,該枚舉對每個枚舉成員都具有類型E的n。 更具體地說,可以通過以下方式編寫Caseclass:
enum Case {public static final Case CASE_ONE;public static final Case CASE_TWO;public static final Case CASE_THREE;…} 2)上面的成員按照聲明的順序出現(xiàn),并且位于枚舉的所有其他靜態(tài)成員之上(這意味著它們是第一個要初始化的成員)。
3)據(jù)說在初始化相應(yīng)字段時創(chuàng)建了枚舉常量。
因此,編譯器會給出類似“從枚舉或?qū)嵗跏蓟绦蛟L問靜態(tài)成員計數(shù)器是非法的”之類的錯誤。 這是因為初始化枚舉的順序:
1)公開的靜態(tài)最終案例CASE_ONE;
2)公共靜態(tài)最終案例CASE_TWO; 3)公共靜態(tài)最終案例CASE_THREE; 4)公共靜態(tài)最終計數(shù)器; 5)
6)
Case() {this.valueDependsOnCounter = counter*counter;}需要做的第一件事是初始化CASE_ONE,但是必須調(diào)用Case()構(gòu)造函數(shù),該構(gòu)造函數(shù)又取決于僅在靜態(tài){}塊中初始化(但尚未執(zhí)行)的計數(shù)器。 。 現(xiàn)在,從構(gòu)造函數(shù)訪問靜態(tài)變量將是一個巨大的限制,但這正是這種流程所暗示的,即您不能在枚舉的構(gòu)造函數(shù)中使用靜態(tài)變量。 幸運的是,這不太正確。 該錯誤實際上試圖告訴我們的是:“從構(gòu)造函數(shù),實例初始化程序塊或?qū)嵗兞砍跏蓟绦虮磉_式中引用枚舉類型的靜態(tài)字段(不是*編譯時常量*)是編譯時錯誤。這種類型的。”。 實際上,編譯器確實允許訪問枚舉構(gòu)造函數(shù)中的statics字段,但僅適用于可以靜態(tài)計算(作為優(yōu)化機制)的那些字段。 如果我們有:
enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter = 0;private int valueDependsOnCounter; Case() {this.valueDependsOnCounter = counter*counter;}},一切都會很好,因為編譯器可以預測計數(shù)器的初始化,在構(gòu)造函數(shù)中使用它,構(gòu)建枚舉實例,并將其分配給靜態(tài)最終CASE_ONE變量。 但是由于計數(shù)器依賴于一些難以預測的計算,因此會引起錯誤。
為了使代碼仍然有效,有兩種解決方案:
1)將所需的靜態(tài)變量放在嵌套類中,然后從那里訪問它們:
class Nested {private static final int counter;static {int sum = 0;for(int i = 0; i<10; i++) {sum +=i;}counter = sum;}}enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter; private int valueDependsOnCounter; Case() {this.valueDependsOnCounter = Nested.counter*Nested.counter;}}2)在構(gòu)造函數(shù)中而不是在靜態(tài)塊中初始化(推薦):
enum Case {CASE_ONE, CASE_TWO,CASE_THREE; private static final int counter;private int valueDependsOnCounter; static {int sum = 0;for(int i = 0; i<10; i++) {sum +=i;}counter = sum;for(Case c : Case.values()) {c.valueDependsOnCounter = counter*counter;}}}討論的異常甚至在JAVA規(guī)范文檔中指定。
參考: Transylvania JUG博客上的JCG合作伙伴 Attila-Mihaly Balazs的Enum益智游戲 。
翻譯自: https://www.javacodegeeks.com/2012/04/java-enum-puzzler.html
java 枚舉內(nèi)嵌枚舉
總結(jié)
以上是生活随笔為你收集整理的java 枚举内嵌枚举_Java枚举益智游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鹈鹕将帮助史蒂芬森恢复 痊愈后或重签他
- 下一篇: unity3d设置中文(unity哪里设