Java學習筆記(4)——枚舉類型

1.在類別(Class)或接口(Interface)中宣告常數加以管理,這只是讓您存取與管理常數方便而已,來看看這個例子:

public void someMethod() {....doOp(OpConstants.TURN_RIGHT);....
}
public void doOp(int op) {switch(op) {case OpConstants.TURN_LEFT:System.out.println("向左轉");break;case OpConstants.TURN_RIGHT:System.out.println("向右轉");break;case OpConstants.SHOOT:System.out.println("射擊");break;}
}

看來是不錯,但doOp()方法接受的是int,您沒有阻止粗心的程序設計人員對它輸入OpConstants中規定外的其它常數,您也沒有檢查 switch中列舉的值是不是正確的值,因為它骨子里就只是int而已

當然您可以作一些檢查,這需要一些額外的工作,如果您使用 J2SE 5.0,則這些額外的工作您不用親自處理,使用列舉型態(Enumerated Types)可以輕易的解決這些問題。

在J2SE 5.0中使用列舉型態要使用"enum"關鍵詞,以下先來看看列舉型態的應用,舉個實際的例子:

OpConstants.java
public enum OpConstants {TURN_LEFT, TURN_RIGHT, SHOOT}

不用懷疑,在OpConstants.java中寫下以上的內容,然后用javac去編譯它,雖然語法上不像,但列舉型態骨子里就是一個類別,所以您編譯完成后,會產生一個OpConstants.class檔案。

來看下面這個例子了解如何使用定義好的列舉型態:

Test.java
public class Test {public static void main(String[] args) {doOp(OpConstants.TURN_RIGHT);}public static void doOp(OpConstants opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左轉");break;case TURN_RIGHT:System.out.println("向右轉");break;case SHOOT:System.out.println("射擊");break;}}
}

執行結果:

向右轉

除了讓您少打一些字之外,好像沒有什么特別的,但如果您對doOp()方法輸入其它的值,編譯器會回報錯誤,因為doOp()所接受的是 OpConstants列舉型態。

更進一步的,如果您在switch中加入了不屬于OpConstants中列舉的數值,編譯器也會回報錯誤,例如:

....
public static void doOp(OpConstants opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左轉");break;case TURN_RIGHT:System.out.println("向右轉");break;case SHOOT:System.out.println("射擊");break;case STOP:System.out.println("停止");break;}
}
....

編譯器會替您作編譯時期的檢查,若檢查出不屬于OpConstant中的列舉值,會顯示以下的錯誤:

unqualified enumeration constant name required
case STOP:
^

您可以在一個獨立的檔案中宣告列舉值,或是在某個類別中宣告列舉成員,例如:

Test.java
public class Test {private enum OpConstant {TURN_LEFT, TURN_RIGHT, SHOOT};public static void doOp(OpConstant opConstant) {switch(opConstant) {case TURN_LEFT:System.out.println("向左轉");break;case TURN_RIGHT:System.out.println("向右轉");break;case SHOOT:System.out.println("射擊");break;}}public static void main(String[] args) {doOp(OpConstant.TURN_LEFT);}
}

由于列舉型態本質上還是個類別,所以這種方式有些像在宣告 內 部類別(Iinner class), 在您編譯完Test.java檔案后,除了Test.class之外,您會有一些額外的.class檔案,在這個例子中就是Test$ OpConstants.class與Test$1.class,看到后兩個檔案,您就應該了解到這個程序的背后運作的有內部成員類別以及內部匿名類別。

2.

定義列舉型態時本質上就是在定義一個類別,只不過很多細節由編譯器幫您補齊了,所以某些程度上,enum關鍵詞的 作用就像是class或interface。

當您使用"enum"定義列舉型態時,實質上您定義出來的型態繼承自 java.lang.Enum 類別,而每個列舉的成員其實就是您定義的列舉型態的一個實例(Instance),它們都被預設為 final,所以您無法改變它們,它們也是 static 成員,所以您可以透過型態名稱直接使用它們,當然最重要的,它們都 是公開的(public)。

舉個例子:

OpConstants.java
public enum OpConstants {TURN_LEFT, TURN_RIGHT, SHOOT} 

在這個例子中,OpConstants繼承自 java.lang.Enum,每個列舉成員如TURN_LEFT、TURN_RIGHT、SHOOT,它們都是OpConstants的一個對象實例, 即是 對象實例,上面自然有一些方法可以采用,例如toString()方法被重新定義了,可以讓您直接取得列舉值的字符串描述,而列舉對象定義的values ()方法可以讓您取得所有的列舉實例,并以數組方式傳回,您使用這兩個方法來簡單的將OpConstants的內容顯示出來:

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {for(OpConstants constant: OpConstants.values()) {System.out.println(constant.toString());}}
}

基本上println()會自動呼叫toString(),所以不寫toString()其實也是可以的,執行結果如下:

TURN_LEFT 
TURN_RIGHT 
SHOOT

您可以使用 "==" 或是 equals() 方法來比較列舉對象,""==""會比較您提供的列舉對象是不是同一個(也就是占據同一個內存位置),而equals()則是實質的比較兩個列舉對象的內容,預設會根據列舉的字符串值來比較。
valueOf()方法可以讓您將指定的字符串嘗試轉換為列舉實例,您可以使用compareTo()方法,這可以比較兩個列舉對象在列舉時的順序,下面舉個例子

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {enumCompareTo(OpConstants.valueOf(args[0]));}public static void enumCompareTo(OpConstants constant) {System.out.println(constant);for(OpConstants c: OpConstants.values()) {System.out.println(constant.compareTo(c));}}
}

執行結果:

$java ShowEnum TURN_RIGHT
TURN_RIGHT
1
0
-1

傳回正值,表示順序在被比較的列舉對象之前,負值表示之后,而0則表示兩個互比列舉值的位置是相同的。

對于每一個列舉成員,我們可以使用ordinal()方法,依列舉順序得到位置索引,預設以 0 開始,例如:

ShowEnum.java
public class ShowEnum {public static void main(String[] args) {for(OpConstants c : OpConstants.values()) {System.out.printf("%d %s%n", c.ordinal(), c);}}
}

執行結果:

0 TURN_LEFT
1 TURN_RIGHT
2 SHOOT

【沒有看完】

轉載于:https://www.cnblogs.com/CheeseZH/archive/2012/12/05/2802429.html

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

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

相關文章

驅動提取軟件_深入分析施耐德工控軟件代碼執行漏洞

更多全球網絡安全資訊盡在邑安全簡介在本文中,我們將為讀者詳細介紹Claroty Research團隊的Amir Preminger和Sharon Brizinov是如何組合利用兩個漏洞,來觸發施耐德工控軟件EcoStruxure Operator Terminal Expert的代碼執行漏洞,從而在首屆舉辦…

ubuntu 網卡突然無法連接

今天要用到VM BT的Namp掃描服務器端口,發現橋接后無法使用。ifconfig 只看到 lo地址,看不到以太網網卡地址使用lspci 查看是否安裝了以太網網卡驅動lscpi | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LA…

atitit.表單驗證 的dsl 本質跟 easyui ligerui比較

atitit.表單驗證的dsl 本質跟 easyui ligerui比較 1. DSL 聲明驗證 1 2. 自定義規則 1 3. 正則表達式驗證,可以擴展實現 2 4. 犯錯誤消息提示,generic canBeEmpty is good 3 5. Prevent the form to submit when invalid 3 6. 為空則不驗證,不為空則驗證&#xff0…

StartActivityForResult

StartActivity 用startActivityForResult(intent, requestcode);啟動子功能模塊activity onActivityResult(int requestCode, int resultCode, Intent data)對子activity返回進行判斷處理 public class StartActivity extends Activity implements OnClickListener {private Bu…

micropython 串口寫文件_MicroPython通過2G模塊串口收發短信

集成2G通信、定位模組,賦予物聯網特性。本例使用M6220,它是一款基于eSIM技術的2G模組,支持GSM/GPRS,提供GPS北斗雙模定位功能,并具備一定的數據處理能力,其2G工作頻段有GSM850、GSM900、DCS1800和PCS1900&a…

洛谷P1130 紅牌

題目描述 某地臨時居民想獲得長期居住權就必須申請拿到紅牌。獲得紅牌的過程是相當復雜 ,一共包括N個步驟。每一步驟都由政府的某個工作人員負責檢查你所提交的材料是否符合條件。為了加快進程,每一步政府都派了M個工作人員來檢查材料。不幸的是&#xf…

GPS坐標換算

30.8872 》——>300.8872*60 53.232 ——>530.232*60 13.9230: 53 13.92"30: 53 13.92"》3053/6013.92/360030.887199同經度兩點之間距離dla30.887m * [差值/(1/3600)] 30.887m * 差值 *3600 111193.2m * 差值 同緯度兩點之間距離dlo30.887m * [差值/(1…

企業級應用框架(五)IOC容器在框架中的應用

前言 在上一篇我大致的介紹了這個系列所涉及到的知識點,在本篇我打算把IOC這一塊單獨提取出來講,因為IOC容器在解除框架層與層之間的耦合有著不可磨滅的作用。當然在本系列前面的三篇中我也提供了一種基于反射的解耦方式,但是始終不是很優雅&…

后端開發需要學什么_都2020年了,還在糾結學什么語言?| 后端篇

幾個禮拜前,一個學弟問我:“Ray,我打算之后要找工作了,不過現在自己沒有特別深入的語言,最近想找一門好好學一下,你覺得學什么語言好呀?”我表示:“這個要看你求職方向、個人喜好、市…

python掃描ip的端口打開情況

我們的韓國bss系統上線之后,要求對主機的端口、資源使用進行統計,端口每個主機去看,太費勁了,所以,就寫了這樣一個小程序,不是很完美但是,可以用啊!哈哈哈,別噴&#xff…

flash java 通信,Flash到JavaScript的通信實例

從HTML可以發送數據到Flash,反過來也可以. 這個例子演示了如何應用Flash的Fscommand來發送數據到Javascript.簡要步驟:Flash中新建一個文件,保存為flash_to_javascript.fla創建一個文本域,設置成輸入文本(Input Text),選擇"border"以便我們能看到他,指定他的變量為in…

10個非常有用的CSS hack和技術

轉自&#xff1a;http://www.qianduan.net/10-useful-css-hacks-and-technique.html 1 – 跨瀏覽器的inline-block <style>li {width: 200px;min-height: 250px;border: 1px solid #000;display: -moz-inline-stack;display: inline-block;margin: 5px;zoom: 1;*display:…

Java的遞歸算法

遞歸算法設計的基本思想是&#xff1a;對于一個復雜的問題&#xff0c;把原問題分解為若干個相對簡單類同的子問題&#xff0c;繼續下去直到子問題簡單到可以直接求解&#xff0c;也就是說到了遞推的出口&#xff0c;這樣原問題就有遞推得解。 關鍵要抓住的是&#xff1a; &…

python list遍歷定位元素_python for循環,第二遍定位不到元素?

ycyzharry: 也不行&#xff0c;我的代碼import unittestimport timeimport xlrdfrom selenium import webdriverimport seleniumdef open_excel(filefile.xls):try:data xlrd.open_workbook(file)return dataexcept Exception as e:print(str(e))def excel_table_byindex(file…

發現Java程序中的Bug

昨天在CSDN上閱讀 "Java中十個常見的違規編碼"這篇文章時&#xff0c;無意中找到了3個 "發現Java程序中的Bug"工具。 文章地址&#xff1a;http://www.csdn.net/article/2012-09-11/2809829-common-code-violations-in-java其中&#xff0c; FindBugs? - …

原生php登錄注冊,原生php登陸注冊

本以為一個登陸注冊功能十來分鐘就寫好了&#xff0c;沒想到thinkPHP用久了&#xff0c;原生的php不會寫了最開始我直接寫了類和方法&#xff0c;在前臺傳遞參數給類的login方法(action"index.php/login"),嘗試幾次發現無法訪問&#xff0c;這才意識到&#xff0c;這…

SpringMVC REST 風格靜態資源訪問配置

1 在web.xml中使用默認servlet處理靜態資源&#xff0c;缺點是如果靜態資源過多&#xff0c;則配置量會比較大&#xff0c;一旦有遺漏&#xff0c;則會造成資源無法正常顯示或404錯誤。 <!-- 靜態資源訪問控制 --><servlet-mapping><servlet-name>default<…

生成對象

var c[name,age,city]; var d[xiaogang,12,anhui]; var a{}; for(var i0;i<3;i){a[c[i]]d[i]; } console.log(a); //返回 {name: "xiaogang", age: "12", city: "anhui"} 轉載于:https://www.cnblogs.com/xiaozhumaopao/p/6046823.html

3.寄存器(內存訪問)

CPU中&#xff0c;用16位來存儲一個字。高8位存放高位字節&#xff0c;低8位存放低位字節。內存存儲中&#xff0c;內存單元是字節單元&#xff08;1單元1字節&#xff09;&#xff0c;則一個字要用兩個地址連續的內存單元存放。內存存儲中&#xff0c;高位字節&#xff0c;和低…

shiro前后端分離_為什么要前后端分離?前后端分離的優點是什么?

隨著互聯網的高速發展以及IT開發技術的升級&#xff0c;前后端分離已成為互聯網項目開發的業界標準使用方式。在實際工作中&#xff0c;前后端的接口聯調對接工作量占HTML5大前端人員日常工作的30%-50%&#xff0c;甚至會更高。接下來千鋒小編分享的廣州HTML5大前端學習就給大家…