Java枚舉益智游戲

假設我們有以下代碼:
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;}}

您認為編譯和運行代碼的結果是什么?

  1. 編譯器錯誤
  2. 運行時錯誤
  3. 運行正常,但valueDependsOnCounter具有奇怪的值
  4. 沒關系

稍加思考。 (擾流塊)答案是按以下順序的第8個字母:bdcadcbabcad。
為了闡明這一點,有必要檢查以下內容:
A.類中靜態初始化的順序:

  1. 靜態viaribales出現的順序
  2. 靜態塊出現的順序
  3. 實例變量的出現順序
  4. 構造函數

B.構造函數調用的順序(這也適用于靜態變量):

  1. 超級班
  2. 本地班

C.用Java表示枚舉對象的方式:

1)名稱E的枚舉除其他外具有一個隱式靜態最終字段,該枚舉對每個枚舉成員都具有類型E的n。 更具體地說,Caseclass可以通過以下方式編寫:

enum Case {public static final Case CASE_ONE;public static final Case CASE_TWO;public static final Case CASE_THREE;…}

2)上面的成員按照聲明的順序出現,并且位于枚舉的所有其他靜態成員之上(這意味著它們是第一個要初始化的成員)。
3)枚舉常量被認為是在相應字段初始化時創建的。

因此,編譯器會發出類似“從枚舉或實例初始化程序訪問靜態成員計數器是非法的”之類的錯誤。 這是因為枚舉被初始化的順序:
1)公共靜態最終案例CASE_ONE;
2)公共靜態最終案例CASE_TWO; 3)公共靜態最終案例CASE_THREE; 4)公共靜態最終計數器; 5)

static {..counter = something;}

6)

Case() {this.valueDependsOnCounter = counter*counter;}

需要做的第一件事是初始化CASE_ONE,但是必須調用Case()構造函數,該構造函數又取決于僅在靜態{}塊中初始化(但尚未執行)的計數器。 。 現在,從構造函數訪問靜態變量將是一個巨大的限制,但這正是這種流程所暗示的,即您不能在枚舉的構造函數中使用靜態變量。 幸運的是,這不太正確。 該錯誤實際上試圖告訴我們的是:“從構造函數,實例初始值設定項塊或實例變量初始值設定項表達式中引用一個不是* compile-time constant *的枚舉類型的靜態字段是一個編譯時錯誤。這種類型的。”。 實際上,編譯器確實允許訪問枚舉構造函數中的statics字段,但僅適用于可以靜態計算(作為優化機制)的那些字段。 如果我們有:

enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter = 0;private int valueDependsOnCounter;  Case() {this.valueDependsOnCounter = counter*counter;}}

,一切都會很好,因為編譯器可以預測計數器的初始化,可以在構造函數中使用它,構建枚舉實例,并將其分配給靜態最終CASE_ONE變量。 但是由于計數器取決于一些難以預測的計算,因此會引起錯誤。

為了使代碼仍然有效,有兩種解決方案:

1)將所需的靜態變量放在嵌套類中,然后從那里訪問它們:

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)在構造函數中而不是在靜態塊中初始化(推薦):

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規范文檔中指定。

參考: Transylvania JUG博客上的JCG合作伙伴 Attila-Mihaly Balazs的枚舉謎題 。


翻譯自: https://www.javacodegeeks.com/2012/04/java-enum-puzzler.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372712.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jp在java中無法編譯_JPanal上加圖片的問題!

JPanal上加圖片的問題&#xff01;import java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.*;import java.awt.*;public class Frame1 extends JFrame {JPanel contentPane;JLabel jLabel1 new JLa…

玩轉Android之加速度傳感器的使用,模仿微信搖一搖

Android系統帶的傳感器有很多種&#xff0c;最常見的莫過于微信的搖一搖了&#xff0c;那么今天我們就來看看Anroid中傳感器的使用&#xff0c;做一個類似于微信搖一搖的效果。 OK ,廢話不多說&#xff0c;我們就先來看看效果圖吧&#xff1a; 當我搖動手機的時候這里的動畫效果…

圖像

背景圖案的設置 將圖片插入到網頁中去 用圖像作為超鏈接 使用工具建立地圖索引 切片索引 為網站添加圖標 5.1 背景圖案的設置&#xff08;背景不占位置&#xff0c;不影響文本的輸入&#xff09; 格式&#xff1a;<body background"URL"> 5.2 將圖片插入…

Maven構建依賴項

熟悉發行版和快照依賴項的Maven和Gradle用戶可能不了解TeamCity快照依賴項&#xff0c;或者認為他們與Maven相關&#xff08;這是不正確的&#xff09;。 熟悉工件和快照依賴關系的TeamCity用戶可能不知道&#xff0c;除了TeamCity提供的插件之外&#xff0c;添加Artifactory插…

Java兩種設計模式_23種設計模式(11)java策略模式

23種設計模式第四篇&#xff1a;java策略模式定義&#xff1a;定義一組算法&#xff0c;將每個算法都封裝起來&#xff0c;并且使他們之間可以互換。類型&#xff1a;行為類模式類圖&#xff1a;策略模式是對算法的封裝&#xff0c;把一系列的算法分別封裝到對應的類中&#xf…

Problem E: 平面上的點——Point類 (II)

Description 在數學上&#xff0c;平面直角坐標系上的點用X軸和Y軸上的兩個坐標值唯一確定。現在我們封裝一個“Point類”來實現平面上的點的操作。 根據“append.cc”&#xff0c;完成Point類的構造方法和show()方法&#xff0c;輸出各Point對象的構造和析構次序。 接口描述&a…

MFC 控件RadioButton和CheckBox區別

1. 單個RadioButton在選中后&#xff0c;通過點擊無法變為未選中 單個CheckBox在選中后&#xff0c;通過點擊可以變為未選中 2. 一組RadioButton&#xff0c;只能同時選中一個 一組CheckBox&#xff0c;能同時選中多個 3. RadioButton在大部分UI框架中默認都以圓形表示 CheckBo…

什么是ActiveMQ?

盡管Active MQ網站已經對ActiveMQ進行了詳盡的介紹&#xff0c;但我想在其定義中添加更多上下文。 從ActiveMQ項目的網站上&#xff1a; “ ActiveMQ是JMS 1.1的開源實現&#xff0c;是J2EE 1.4規范的一部分。” 這是我的看法&#xff1a;ActiveMQ是一種開源消息傳遞軟件&…

字符串倒著輸出java_Java 輸出反轉字符串

Java 輸出反轉字符串public class Test {public static void main(String args[]){try{// 獲取鍵盤輸入的字符串BufferReader f new BufferReader(new inputStreamReader(System.in));String str f.readline();for (int i str.length() -1 ; i >0 ; i--) {System.out.p…

webpack基礎入門

我相信&#xff0c;有不少的朋友對webpack都有或多或少的了解。網上也有了各種各樣的文章&#xff0c;文章內作者也寫出了不少自己對于webpack這個工具的理解。在我剛剛接觸webpack的時候&#xff0c;老實說&#xff0c;網上大部分的文章我是看不懂的。。webpack里面有很多名詞…

位運算基礎

異或運算的基礎有點忘記了 先介紹一下。。2個數異或 就是對于每一個二進制位進行位運算 具有2個特殊的性質 1、一個數異或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一個數異或0恒等于本身&#xff0c;如5^0恒等于5。 3 滿足交換律 1.交換數字這個性質能利用與交換數…

JAXB自定義綁定– Java.util.Date / Spring 3序列化

JaxB可以處理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要將日期對象格式化為另一種格式怎么辦&#xff1f; 我有同樣的問題時&#xff0c;我正在同春MVC 3和Jackson JSON處理器 &#xff0c;最…

雙足機器人簡單步態生成

讓機器人行走最簡單的方法是先得到一組步態曲線&#xff0c;即腿部每個關節隨時間運動的角度值。可以在ADAMS或3D Max、Blender等軟件中建立好機構/骨骼模型&#xff0c;設計出腳踝和髖關節的運動曲線&#xff0c;然后進行逆運動學解算&#xff0c;測量每個關節在運動過程中的轉…

重新訪問了訪客模式

訪客模式是面向對象設計中最被高估但又被低估的模式之一。 高估了它&#xff0c;因為它常常被選擇得太快&#xff08; 可能是由建筑宇航員選擇的 &#xff09;&#xff0c;然后以錯誤的方式添加時會膨脹本來非常簡單的設計。 如果您不遵循教科書示例&#xff0c;那么它可能會非…

java web開發技術大_2021年六大javaweb開發主流技術

作為歷史最為悠久的編程語言——java&#xff0c;歷經數十年依然盤踞在編程榜最前面的位置&#xff0c;這與它的技術和應用范圍是分不開的&#xff0c;同時呢&#xff0c;javaweb開發主流技術更是java開發者時時刻刻關注的問題&#xff0c;接下來我們一起分析一下2020年互聯網行…

ASP.NET—013:實現帶控件的彈出層(彈出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在頁面中用到彈出新頁面的情況比較多的&#xff0c;一般來說都是使用JS方法showModalDialog("新頁面相對路徑?參數1&參數2",window,"新頁面樣式");然后會新彈出一個模態的page頁。…

運維人員日常工作(轉自老男孩)

1&#xff09;運維人員要謹記的6個字&#xff1a; 運維人員做事需遵循&#xff1a;簡單、易用、高效 &#xff08;2&#xff09;運維人員服務的3大宗旨&#xff1a; 1、企業數據安全保障。 2、7*24小時業務持續提供服務。 3、不斷提升用戶感受、體驗。 &#xff08;3&#xff0…

c# 操作DatatTable

dtTemp.Columns.Add("列名");//增加一列 dtTemp.Columns.Remove("列名");//刪除一列 dtTemp.Columns["舊列名"].ColumnName "新列名";//修改列名 dtTemp.Columns["列名1"].SetOrdinal(dtTemp.Columns["列名2"].O…

java 二進制 歸屬權限_【Java EE 學習 75 上】【數據采集系統第七天】【二進制運算實現權限管理】【權限分析和設計】...

一、權限計算相關分析1.如何存儲權限首先說一下權限保存的問題&#xff0c;一個系統中最多有多少權限呢&#xff1f;一個大的系統中可能有成百上千個權限需要管理。怎么保存這么多的權限&#xff1f;首先&#xff0c;我們使用一個數字中的一位保存一種權限&#xff0c;那么如果…

MongoDB性能測試

因此&#xff0c;今天早上&#xff0c;我在mongo shell中四處亂逛。 我想出了三種不同的方式來聚合所需的數據&#xff0c;但不確定隨后應移植哪種代碼以在應用程序中使用。 那么&#xff0c;我將如何決定實施哪種方法呢&#xff1f; 好吧&#xff0c;讓我們選擇性能最佳的產品…