JDK源碼解析之 Java.lang.Enum

Enum是一個特殊的類. 我們不能以class Xxx extends Enum的方式手動繼承, 必須寫成enum Xxx的形式; 然而這段枚舉類的定義在編譯之后又變回了class Xxx extends Enum.

一、類定義

public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable {}
  • Enum是一個虛基類,
  • 繼承了Number抽象類,可以用于數字類型的一系列轉換;
  • 實現了Comparable接口,強行對實現它的每個類的對象進行整體排序

二、成員常量和取值器

//成員常量name,被聲明為final類型,意為不可變,同時只提供取值器。
private final String name; 
public final String name() {return name;
}
//成員常量ordinal,被聲明為final類型,意為不可變,同時只提供取值器。
private final int ordinal;
public final int ordinal() {return ordinal;
}

三、構造函數

    protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}

構造函數被定義成protected,參數有兩個,分別是name和ordinal,和成員常量相呼應。

四、常用方法

1、toString()

返回成員常量name的值。

    public String toString() {return name;}

2、equals()

參數為Object類型,方法內部判斷是不是和this指向同一對象。注意這個方法final被修飾,也就是說枚舉不可以覆寫這個類。

    public final boolean equals(Object other) {return this==other;}

3、hashCode()

委托父類執行,即Object類的hashCode方法執行。注意這個方法final被修飾,也就是說枚舉不可以覆寫這個類。

    public final int hashCode() {return super.hashCode();}

4、clone()

直接拋出異常,不支持拷貝。這也符合枚舉唯一的特性。值得注意的是,這個方法被定義成protected,也就是只能包內和子類可見,并且不可以覆寫。

    protected final Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();}

5、compareTo()

有這個方法,一方面是因為Enum類實現了Comparable接口,一方面也符合枚舉可以比較的特點。值得注意的是,方法內部可以看出,要求比較的對象必須是相同枚舉類型的,否則便會引起ClassCastException異常。對相同類型枚舉值,比較的則是它們的成員常量ordinal大小。

    public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}

6、getDeclaringClass()

這個方法在compareTo()方法中出現了。

    @SuppressWarnings("unchecked")public final Class<E> getDeclaringClass() {Class<?> clazz = getClass();Class<?> zuper = clazz.getSuperclass();return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;}

7、valueOf()

通過參數name來返回枚舉值,注意,如果name沒有與之對應的枚舉,返回的不是null,而是拋出異常。

public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {T result = enumType.enumConstantDirectory().get(name);if (result != null)return result;if (name == null)throw new NullPointerException("Name is null");throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);}

8、readObject()

防治反序列化的,使用private來定義方法,且在方法內部拋出異常。目的就是為了維護枚舉值的唯一性。

private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {throw new InvalidObjectException("can't deserialize enum");}

9、readObjectNoData()

同readObject方法一樣,都是為了防止反序列化的。

    private void readObjectNoData() throws ObjectStreamException {throw new InvalidObjectException("can't deserialize enum");}

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

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

相關文章

Linux下的一些簡單網絡配置命令介紹

1、 ifconfig可以使用ifconfig命令來配置并查看網絡接口的配置情況。例如&#xff1a;&#xff08;1&#xff09; 配置eth0的IP地址&#xff0c; 同時激活該設備。#ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up&#xff08;2&#xff09; 配置eth0別名設備eth0:1的IP地…

JDK源碼解析之 java.lang.Throwable

在 Java 中&#xff0c;所有的異常都有一個共同的祖先 Throwable&#xff08;可拋出&#xff09;。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。 一、類定義 public class Throwable implements Serializable {}Serializable&#xff1a;可…

JDK源碼解析之 java.lang.Error

java.lang.Error 錯誤。是所有錯誤的基類&#xff0c;用于標識嚴重的程序運行問題。這些問題通常描述一些不應被應用程序捕獲的反常情況。 一、源碼部分 //繼承了java.lang.Throwable public class Error extends Throwable {//適用于java序列化機制,過判斷類的serialVersionU…

linux命令之有關網絡的操作命令

1&#xff0e;hostname 命令&#xff08;1&#xff09;一般格式&#xff1a;hostname [選項] [主機名]&#xff08;2&#xff09;說明&#xff1a;顯示或設置系統的主機名&#xff1b;如果無任何選項和主機名&#xff0c;則用于顯示系統的主機名。&#xff08;3&#xff09…

JDK源碼解析之 java.lang.Exception

異常。是所有異常的基類&#xff0c;用于標識一般的程序運行問題。這些問題通常描述一些會被應用程序捕獲的反常情況。 一、源碼部分 //繼承了java.lang.Throwable public class Exception extends Throwable {//適用于java序列化機制,過判斷類的serialVersionUID來驗證的版本…

linux命令之有關關機和查看系統信息的命令

shutdown 正常關機 reboot 重啟計算機 ps 查看目前程序執行的情況top 查看目前程序執行的情景和內存使用情況kill 終止一個進程date 更改或查看目前時間 一&#xff0e;查看系統的進程 要管理進程&#xff0c;首先要知…

HDFS-文件讀寫過程

一、文件讀取 Client向NameNode發起RPC請求&#xff0c;來確定請求文件block所在的位置&#xff1b;NameNode會視情況返回文件的部分或者全部block列表&#xff0c;對于每個block&#xff0c;NameNode 都會返回含有該 block 副本的 DataNode 地址&#xff1b; 這些返回的 DN 地…

linux命令復習之有關磁盤空間的命令

1&#xff0e;mount 命令&#xff08;1&#xff09;一般格式&#xff1a;mount 文件系統類型 [選項] 掛接設備&#xff08;2&#xff09;說明&#xff1a;將某個文件系統掛載到某個目錄上。當這個命令執行成功后&#xff0c;直到使用 umount 將這個文件系統移除為止。&…

HDFS-常用API操作

一、Maven <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>…

linux命令之-管理文件和目錄的命令

一. 創建和刪除目錄的命令 1&#xff0e;mkdir 命令 &#xff08;1&#xff09;一般格式&#xff1a;mkdir [選項] 目錄名 &#xff08;2&#xff09;說明&#xff1a;該命令創建由目錄名命名的目錄。 &#xff08;3&#xff09;舉例1&#xff1a; 在目錄 /usr/fedora 下建…

Hive-簡介入門

Hive簡介 Hive最初是Facebook為了滿足對海量社交網絡數據的管理和機器學習的需求而產生和發展的。互聯網現在進入了大數據時代&#xff0c;大數據是現在互聯網的趨勢&#xff0c;而hadoop就是大數據時代里的核心技術&#xff0c;但是hadoop的mapreduce操作專業性太強&#xff0…

Hive-原理解析

一、Hive 架構 下面是Hive的架構圖。 Hive的體系結構可以分為以下幾部分 1、用戶接口&#xff1a;CLI&#xff08;hive shell&#xff09;&#xff1b;JDBC&#xff08;java訪問Hive&#xff09;&#xff1b;WEBUI&#xff08;瀏覽器訪問Hive&#xff09; 2、元數據&#x…

linux命令之history命令

在Linux系統上輸入命令并按下Enter后&#xff0c;這個命令就會存放在命令記錄表 ( ~/.bash_history )中&#xff0c;預定的記錄為1000條&#xff0c;這些都定義在環境變量中。列出所有的歷史記錄&#xff1a;#history 只列出最近10條記錄&#xff1a;#history 10 (注,history和…

Hive-配置安裝

一、HDFS安裝 1、解壓到指定位置tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /usr/local/apps/ 2、改名mv apache-hive-3.1.2-bin/ hive-3.1.2 3、在conf目錄下添加Hadoop安裝路徑mv hive-env.sh.template hive-env.sh # 配置HADOOP_HOME路徑 export HADOOP_HOME/opt/module/…

linux文件系統概念目錄結構

文件系統概念一. 文件與目錄的定義1. 文件系統&#xff1a;它是磁盤上有特定格式的一片區域&#xff0c;操作系統通過文件系統可以方便地查尋和訪問其中所包含的磁盤塊&#xff1b;2. 文件&#xff1a;文件系統中存儲數據的一個命名的對象。3. 目錄&#xff1a;其中包含許多文件…

JDK源碼解析之 java.lang.Class

Java程序在運行時&#xff0c;Java運行時系統一直對所有的對象進行所謂的運行時類型標識。 這項信息紀錄了每個對象所屬的類。虛擬機通常使用運行時類型信息選準正確方法去執行&#xff0c;用來保存這些類型信息的類是Class類。Class類封裝一個對象和接口運行時的狀態&#xff…

Linux Vi常用技巧

VI常用技巧VI命令可以說是Unix/Linux世界里最常用的編輯文件的命令了&#xff0c;但是因為它的命令集眾多&#xff0c;很多人都不習慣使用它&#xff0c;其實您只需要掌握基本命令&#xff0c;然后加以靈活運用&#xff0c;就會發現它的優勢&#xff0c;并會逐漸喜歡使用這種方…

JDK源碼解析之 java.lang.ClassLoader

Class代表它的作用對象是類&#xff0c;Loader代表它的功能是加載&#xff0c;那么ClassLoader就是把一個以.class結尾的文件以JVM能識別的存儲形式加載到內存中。 一、核心方法 1、loadClass方法 protected Class<?> loadClass(String name, boolean resolve) throws…

Linux Vi的使用

一、插入文本┌──┬────────────┐│命令│描述 │├──┼────────────┤│i │在當前字符前插入文本 │├──┼────────────┤│I │在行首插入文本 │├──┼────────────┤│a │在當前字符后添加文本 │├──┼──…

Hive-beeline服務

Hive客戶端工具后續使用了Beeline 替代HiveCLI &#xff0c;并且后續版本也會廢棄掉HiveCLI 客戶端工具,Beeline是 Hive 0.11版本引入的新命令行客戶端工具,它是基于SQLLine CLI的JDBC客戶端。 Beeline支持嵌入模式(embedded mode)和遠程模式(remote mode)。在嵌入式模式下&am…