關於enumjava的信息

本文目錄一覽:

java中的enum有什麼用呢?

enum也就是枚舉,像一個集合,只不過集合裡面的內容都固定了.

public enum Season3 {

SPRING(“春天”),

SUMMER(“夏天”),

AUTUMN(“秋天”),

WINTER(“冬天”);

private String name;

private Season3(String name){

this.name = name;

}

public double getAvgTemp(){

switch(this){

case SPRING:return 10.2;

case SUMMER:return 25.8;

case AUTUMN:return 19.6;

case WINTER:return -3.6;

}

return 0.0;

}

public String getName(){

return name;

}

}

public class Test {

public static void main(String[] args) {

m3(Season3.SPRING);

}

public static void m3(Season3 season){

System.out.println(season.getName()+”:”+season.getAvgTemp());

Season3[] allSeason = Season3.values();//返回枚舉類中所有枚舉值的一個數組

System.out.println(allSeason[0]);

}

}

enum是java關鍵字嗎?

enum是Java的關鍵字,Java的關鍵字如下:

abstract 表明類或者成員方法具有抽象屬性

assert 用來進行程序調試

boolean 基本數據類型之一,布爾類型

break 提前跳出一個塊

byte 基本數據類型之一,字節類型

case 用在switch語句之中,表面其中的一個分支

catch 用在異常處理中,用來捕捉異常

char 基本數據類型之一,字符類型

class 類

const 保留關鍵字,沒有具體含義

continue 回到一個塊的開始處

default 默認,例如,用在switch語句中,表明一個默認的分支

do 用在do-while循環結構中

double 基本數據類型之一,雙精度浮點數類型

else 用在條件語句中,表明當條件不成立時的分支

enum 枚舉

extends 表明一個類型是另一個類型的子類型,這裡常見的類型有類和接口

final 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變

finally 用於處理異常情況,用來聲明一個基本肯定會被執行到的語句塊

float 基本數據類型之一,單精度浮點數類型

for 一種循環結構的引導詞

goto 保留關鍵字,沒有具體含義

if 條件語句的引導詞

implements 表明一個類實現了給定的接口

import 表明要訪問指定的類或包

instanceof 用來測試一個對象是否是指定類型的實例對象

int 基本數據類型之一,整數類型

interface 接口

long 基本數據類型之一,長整數類型

native 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的

new 用來創建新實例對象

package 包

private 一種訪問控制方式:私用模式

protected 一種訪問控制方式:保護模式

public 一種訪問控制方式:共用模式

return 從成員方法中返回數據

short 基本數據類型之一,短整數類型

static 表明具有靜態屬性

strictfp 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循IEEE 754算術規範

super 表明當前對象的父類型的引用或者父類型的構造方法

switch 分支語句結構的引導詞

sychronized 表明一段代碼需要同步執行

this 指向當前實例對象的引用

throw 拋出一個異常

throws 聲明在當前定義的成員方法中所有需要拋出的異常

transient 聲明不用序列化的成員域

try 嘗試一個可能拋出異常的程序塊

void 聲明當前成員方法沒有返回值

volatile 表明兩個或者多個變量必須同步地發生變化

while 用在循環結構中

enum在java中是什麼意思

Enum 類型的介紹

枚舉類型(Enumerated Type) 很早就出現在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變量提供更大的取值範圍。

舉個例子來說明一下,如果希望為彩虹描繪出七種顏色,你可以在 Java 程序中通過常量定義方式來實現。

清單 1. 常量定義

Public static class RainbowColor { 

    

    // 紅橙黃綠青藍紫七種顏色的常量定義

    public static final int RED = 0; 

    public static final int ORANGE = 1; 

    public static final int YELLOW = 2; 

    public static final int GREEN = 3; 

    public static final int CYAN = 4; 

    public static final int BLUE = 5; 

    public static final int PURPLE = 6; 

 }

使用的時候,你可以在程序中直接引用這些常量。但是,這種方式還是存在着一些問題。

類型不安全

由於顏色常量的對應值是整數形,所以程序執行過程中很有可能給顏色變量傳入一個任意的整數值,導致出現錯誤。

沒有命名空間

由於顏色常量只是類的屬性,當你使用的時候不得不通過類來訪問。

一致性差

因為整形枚舉屬於編譯期常量,所以編譯過程完成後,所有客戶端和服務器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增加新的枚舉值後,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現錯誤。

類型無指意性

由於顏色枚舉值僅僅是一些無任何含義的整數值,如果在運行期調試時候,你就會發現日誌中有很多魔術數字,但除了程序員本身,其他人很難明白其奧秘。

如何定義 Enum 類型

為了改進 Java 語言在這方面的不足彌補缺陷,5.0 版本 SDK 發布時候,在語言層面上增加了枚舉類型。枚舉類型的定義也非常的簡單,用 enum 關鍵字加上名稱和大括號包含起來的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的 enum 方式來重新定義:

enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

從上面的定義形式來看,似乎 Java 中的枚舉類型很簡單,但實際上 Java 語言規範賦予枚舉類型的功能非常的強大,它不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴展允許開發者給枚舉類型增加任何方法和屬性,也可以實現任意的接口。另外,Java 平台也為 Enum 類型提供了高質量的實現,比如默認實現 Comparable 和 Serializable 接口,讓開發者一般情況下不用關心這些細節。

回到本文的主題上來,引入枚舉類型到底能夠給我們開發帶來什麼樣好處呢?一個最直接的益處就是擴大 switch 語句使用範圍。5.0 之前,Java 中 switch 的值只能夠是簡單類型,比如 int、byte、short、char, 有了枚舉類型之後,就可以使用對象了。這樣一來,程序的控制選擇就變得更加的方便,看下面的例子:

清單 2. 定義 Enum 類型

// 定義一周七天的枚舉類型

 public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } 

 // 讀取當天的信息

 WeekDayEnum today = readToday(); 

 

 // 根據日期來選擇進行活動

 switch(today) { 

  Mon: do something; break; 

  Tue: do something; break; 

  Wed: do something; break; 

  Thu: do something; break; 

  Fri: do something; break; 

  Sat: play sports game; break; 

  Sun: have a rest; break; 

 }

對於這些枚舉的日期,JVM 都會在運行期構造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch 語句就根據此來進行執行跳轉。

如何定製 Enum 類型

除了以上這種最常見的枚舉定義形式外,如果需要給枚舉類型增加一些複雜功能,也可以通過類似 class 的定義來給枚舉進行定製。比如要給 enum 類型增加屬性,可以像下面這樣定義:

清單 3. 定製枚舉類型

// 定義 RSS(Really Simple Syndication) 種子的枚舉類型

 public enum NewsRSSFeedEnum { 

    // 雅虎頭條新聞 RSS 種子

    YAHOO_TOP_STORIES(“”), 

    

    //CBS 頭條新聞 RSS 種子

    CBS_TOP_STORIES(“”), 

    

    // 洛杉磯時報頭條新聞 RSS 種子

    LATIMES_TOP_STORIES(“”); 

        

    // 枚舉對象的 RSS 地址的屬性

    private String rss_url; 

        

    // 枚舉對象構造函數

    private NewsRSSFeedEnum(String rss) { 

        this.rss_url = rss; 

    } 

        

    // 枚舉對象獲取 RSS 地址的方法

    public String getRssURL() { 

        return this.rss_url; 

    } 

 }

上面頭條新聞的枚舉類型增加了一個 RSS 地址的屬性 , 記錄頭條新聞的訪問地址。同時,需要外部傳入 RSS 訪問地址的值,因而需要定義一個構造函數來初始化此屬性。另外,還需要向外提供方法來讀取 RSS 地址。

如何避免錯誤使用 Enum

不過在使用 Enum 時候有幾個地方需要注意:

enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。

定義 enum 類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符號;但如果有定製方法,那麼最後一個枚舉值與後面代碼要用分號’;’隔開,不能用逗號或空格。

由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( ‘ == ’ ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。

看下面的這個例子:

清單 4. 避免錯誤使用 Enum 示例

// 定義一個一周七天的枚舉類型

 package example.enumeration.codes; 

 public enum WeekDayEnum { 

    Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7); 

    private int index; 

    WeekDayEnum(int idx) { 

        this.index = idx; 

    } 

    public int getIndex() { 

        return index; 

    } 

 }

// 客戶端程序,將一個枚舉值通過網絡傳遞給服務器端

 package example.enumeration.codes; 

 import java.io.IOException; 

 import java.io.ObjectOutputStream; 

 import java.io.OutputStream; 

 import java.net.InetSocketAddress; 

 import java.net.Socket; 

 import java.net.UnknownHostException; 

 public class EnumerationClient { 

    public static void main(String… args) throws UnknownHostException, IOException { 

        Socket socket = new Socket(); 

  // 建立到服務器端的連接

        socket.connect(new InetSocketAddress(“127.0.0.1”, 8999)); 

    // 從連接中得到輸出流

        OutputStream os = socket.getOutputStream(); 

        ObjectOutputStream oos = new ObjectOutputStream(os); 

  // 將星期五這個枚舉值傳遞給服務器端

        oos.writeObject(WeekDayEnum.Fri); 

        oos.close(); 

        os.close(); 

        socket.close(); 

    } 

 } 

 // 服務器端程序,將從客戶端收到的枚舉值應用到邏輯處理中

 package example.enumeration.codes; 

 import java.io.*; 

 import java.net.ServerSocket; 

 import java.net.Socket; 

 public class EnumerationServer { 

    public static void main(String… args) throws IOException, ClassNotFoundException { 

        ServerSocket server = new ServerSocket(8999); 

  // 建立服務器端的網絡連接偵聽

        Socket socket = server.accept(); 

  // 從連接中獲取輸入流

        InputStream is = socket.getInputStream(); 

        ObjectInputStream ois = new ObjectInputStream(is); 

  // 讀出客戶端傳遞來的枚舉值

        WeekDayEnum day = (WeekDayEnum) ois.readObject(); 

  // 用值比較方式來對比枚舉對象

        if (day == WeekDayEnum.Fri) { 

            System.out.println(“client Friday enum value is same as server’s”); 

        } else if (day.equals(WeekDayEnum.Fri)) { 

            System.out.println(“client Friday enum value is equal to server’s”); 

        } else { 

            System.out.println(“client Friday enum value is not same as server’s”); 

        } 

        

  // 用 switch 方式來比較枚舉對象

        switch (day) { 

            case Mon: 

                System.out.println(“Do Monday work”); 

                break; 

            case Tue: 

                System.out.println(“Do Tuesday work”); 

                break; 

            case Wed: 

                System.out.println(“Do Wednesday work”); 

                break; 

            case Thu: 

                System.out.println(“Do Thursday work”); 

                break; 

            case Fri: 

                System.out.println(“Do Friday work”); 

                break; 

            case Sat: 

                System.out.println(“Do Saturday work”); 

                break; 

            case Sun: 

                System.out.println(“Do Sunday work”); 

                break; 

            default: 

                System.out.println(“I don’t know which is day”); 

                break; 

        } 

        

        ois.close(); 

        is.close(); 

        socket.close(); 

    } 

 }

打印結果如下:

client Friday enum value is same as server’s

Do Friday work

通過程序執行結果,我們能夠發現在分布式條件下客戶端和服務端的虛擬機上都生成了一個枚舉對象,即使看起來一樣的 Fri 枚舉值,如果使用等號‘ == ’進行比較的話會出現不等的情況。而 switch 語句則是通過 equal 方法來比較枚舉對象的值,因此當你的枚舉對象較複雜時候,你就需要小心 override 與比較相關的方法,防止出現值比較方面的錯誤。

Enum 相關工具類

JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 接口實現。EnumSet 中裝入的所有枚舉對象都必須是同一種類型,在其內部,是通過 bit-vector 來實現,也就是通過一個 long 型數。EnumSet 支持在枚舉類型的所有值的某個範圍中進行迭代。回到上面日期枚舉的例子上:

enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }

你能夠在每周七天日期中進行迭代,EnumSet 類提供一個靜態方法 range 讓迭代很容易完成:

for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) { 

     System.out.println(day); 

 }

打印結果如下:

Mon 

 Tue 

 Wed 

 Thu 

 Fri

EnumSet 還提供了很多個類型安全的獲取子集的 of 方法,使你很容易取得子集:

EnumSetWeekDayEnum subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed); 

      for (WeekDayEnum day : subset) { 

          System.out.println(day);  

      }

打印結果如下:

Mon 

 Wed

與 EnumSet 類似,EnumMap 也是一個高性能的 Map 接口實現,用來管理使用枚舉類型作為 keys 的映射表,內部是通過數組方式來實現。EnumMap 將豐富的和安全的 Map 接口與數組快速訪問結合到一起,如果你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看下面的例子:

清單 5. EnumMap 示例

// 定義一個 EnumMap 對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型

 private static MapWeekDayEnum, RainbowColor schema = 

            new EnumMapWeekDayEnum, RainbowColor(WeekDayEnum.class); 

    

 static{ 

    // 將一周的每一天與彩虹的某一種色彩映射起來

    for (int i = 0; i  WeekDayEnum.values().length; i++) { 

        schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]); 

    } 

 } 

 System.out.println(“What is the lucky color today?”); 

 System.out.println(“It’s ” + schema.get(WeekDayEnum.Sat));

當你詢問周六的幸運色彩時候,會得到藍色:

清單 6. 運行結果

What is the lucky color today?

It’s BLUE

結束語

Enum 類型提出給 JAVA 編程帶了了極大的便利,讓程序的控制更加的容易,也不容易出現錯誤。所以在遇到需要控制程序流程時候,可以多想想是否可以利用 enum 來實現。

Java 中 Enum 如何繼承?

Java Enum是不能繼承的,以下是解釋:

枚舉類使用enum定義後在編譯後默認繼承了java.lang.Enum類,而不是普通的繼承Object類。enum聲明類繼承了Serializable和Comparable兩個接口。且採用enum聲明後,該類會被編譯器加上final聲明(同String),故該類是無法繼承的。枚舉類的內部定義的枚舉值就是該類的實例(且必須在第一行定義,當類初始化時,這些枚舉值會被實例化)。

Java 5新增的enum關鍵詞,可以定義枚舉類。該類是一個特殊的類,可以定義自己的field、方法、可以實現接口,也可以定義自己的構造器。

java的enum到底有什麼用?

1.關於 Java Enum

Enum 一般用來表示一組相同類型的常量。如性別、日期、月份、顏色等。對這些屬性用常量的好處是顯而易見的,不僅可以保證單例,且比較時候可以用 ”==” 來替換 equals 。是一種好的習慣。 JDK1.5 之前沒有 Enum 這個類型,那時候一般用接口常量來替代。有了 JavaEnum 之後,可以更貼近的表示這種常量。

2. 如何使用 Java Enum

簡單的用法: JavaEnum 簡單的用法一般用於代表一組常用常量,可用來代表一類相同類型的常量值。如:

//性別

public enum SexEnum { 

  male , female ; 

}

//顏色

public enum Color { 

  RED , BLUE,GREEN,BLACK ; 

}

枚舉對象裡面的值都必須是唯一的。

可以通過 Enum 類型名直接引用該常量,如 SexEnum.male,Color.RED.

複雜用法: Java 為枚舉類型提供了一些內置的方法,同事枚舉常量還可以有自己的方法。可以很方便的遍歷枚舉對象,看個下面的例子:

WeekDay.java

/**

 * @author admin

 * 2015-12-03

 * 定義一個枚舉類型,代表星期一到星期日的7個縮寫常量

 * 同時還定義了枚舉類型的屬性day,該屬性可以是final,也可是變量

 * 同時還定義了該枚舉類型的一個方法printDay

 */

public enum WeekDay {

Mon(“Monday”), Tue(“Tuesday”), Wed(“Wednesday”), Thu(“Thursday”), Fri(

        “Friday”), Sat(“Saturday”), Sun(“Sunday”);

/**定義枚舉類型自己的屬性**/

private final String day;

 

private WeekDay(String day) {

     this.day = day;

}

/**定義枚舉類型自己的方法**/

public static void printDay(int i){

     switch(i){

     case 1: System.out.println(WeekDay.Mon); break;

     case 2: System.out.println(WeekDay.Tue);break;

     case 3: System.out.println(WeekDay.Wed);break;

     case 4: System.out.println(WeekDay.Thu);break;

     case 5: System.out.println(WeekDay.Fri);break;

     case 6: System.out.println(WeekDay.Sat);break;

     case 7: System.out.println(WeekDay.Sun);break;

     default:System.out.println(“wrong number!”);

     }

}

 

public String getDay() {

     return day;

}

}

WeekDayTest.java

/**

 * @author admin

 * 2015-12-03

 * 測試枚舉類型WeekDay.

 */

public class WeekDayTest {

  public static void main(String args[]) {

      for (WeekDay day : WeekDay.values()) {

         System.out.println(day + “====” + day.getDay());

      }

      WeekDay.printDay(5);

  }

}

輸出結果為:

Mon====Monday

Tue====Tuesday

Wed====Wednesday

Thu====Thursday

Fri====Friday

Sat====Saturday

Sun====Sunday

Fri

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/252157.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-13 17:34
下一篇 2024-12-13 17:34

相關推薦

  • Java 監控接口返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控接口返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • 已裝備我軍的空中信息化作戰平台

    本文將會從多個方面詳細闡述已裝備我軍的空中信息化作戰平台。 一、平台概述 已裝備我軍的空中信息化作戰平台是一個全新的作戰系統,具備實時數據採集、處理、分析、共享的能力。它可以在不同…

    編程 2025-04-27
  • 通過提交信息搜索-使用git

    本篇文章重點講解如何使用git通過提交信息來搜索。我們將從多個方面介紹如何使用git來搜索提交信息,並提供相應的代碼示例以供參考。 一、搜索方式 Git提供了三種搜索方式,分別為:…

    編程 2025-04-27
  • Linux查看系統信息

    一、CPU信息 Linux系統下,查看CPU的信息最常用的命令是lscpu。該命令可以顯示CPU架構、核心數量、線程數、緩存大小、CPU頻率等信息。例如: lscpu 該命令會輸出…

    編程 2025-04-24
  • 軟考 信息安全工程師

    軟考 信息安全工程師是一項技能型國家級資格認證考試,主要測試考生在信息安全領域的理論知識和實踐技能,是證明個人信息安全能力的重要證書。本文將從多個方面對軟考 信息安全工程師做詳細的…

    編程 2025-04-23

發表回復

登錄後才能評論