Java的枚舉,注解和反射(一)
枚舉
什么是枚舉?
枚舉的字面意思就是 一一列舉出來
在數(shù)學(xué)和計算機(jī)科學(xué)理論中,一個集的枚舉是列出某些有窮序列集的所有成員的程序,或者是一種特定類型對象的計數(shù)。這兩種類型經(jīng)常(但不總是)重疊。是一個被命名的整型常數(shù)的集合,枚舉在日常生活中很常見,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一個枚舉。再比如線程的狀態(tài):創(chuàng)建、運(yùn)行、阻塞、等待、消亡,這也是一個枚舉。
在java中的枚舉也是類似的:
枚舉是在JDK1.5以后引入的。主要用途是:將一組常量組織起來。
當(dāng)需要定義一組常量的時候就可以使用枚舉。枚舉的對象是有限的、確定的。
枚舉本身就是一個類,其構(gòu)造方法默認(rèn)為私有的。
如果枚舉類的對象只有一個,則可以作為單例模式的一種實(shí)現(xiàn)方式。
枚舉類的實(shí)現(xiàn)
自定義實(shí)現(xiàn)枚舉類
jdk1.5之前使用自定義的方式實(shí)現(xiàn)枚舉類的定義
package enumDemo;
/**
* user:ypc;
* date:2021-06-22;
* time: 18:21;
* 自定義實(shí)現(xiàn)枚舉類
*/
public class EnumDemo1 {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
//自定義實(shí)現(xiàn)季節(jié)的枚舉類
class Season {
//1.首先要求枚舉類是常量,就可以使用 private final 來修飾
private final String seasonName;
private final String seasonDesc;
//2.常量肯定要賦值,提供私有的構(gòu)造方法來初始化常量
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3.枚舉的對象是有限個的,確定的。所以要提供對應(yīng)的枚舉對象
public static final Season SPRING = new Season("春天", "春暖花開");
public static final Season SUMMER = new Season("夏天", "夏日炎炎");
public static final Season AUTUMN = new Season("秋天", "秋高氣爽");
public static final Season WINTER = new Season("冬天", "冰天雪地");
//提供獲取枚舉的屬性的方法
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}

使用關(guān)鍵字enum定義枚舉類
jdk1.5引入enum關(guān)鍵字
package enumDemo;
import org.junit.Test;
/**
* user:ypc;
* date:2021-06-22;
* time: 18:40;
* 使用enum關(guān)鍵字來定義枚舉類
*/
public class EnumDemo2 {
@Test
public void test(){
SeasonEnum spring = SeasonEnum.SPRING;
System.out.println(spring);
//枚舉類的父類是
System.out.println("枚舉類的父類是:"+SeasonEnum.class.getSuperclass().getName());
}
}
enum SeasonEnum{
//提供當(dāng)前枚舉類的對象,之間使用","隔開,最后一個對象使用";"隔開
SPRING("春天","春暖花開"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高氣爽"),
WINTER("冬天","冰天雪地");
private final String seasonName;
private final String seasonDesc;
private SeasonEnum(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}

Enum的常用方法
package enumDemo;
import org.junit.Test;
/**
* @author ypc
* @create 2021-06-22;
* 枚舉類常用的方法
*/
public class EnumDemo3 {
@Test
public void test() {
//toString方法
System.out.println(SeasonEnum.SPRING.toString());
System.out.println("****************************");
//values方法.
SeasonEnum[] seasonEnums = SeasonEnum.values();
System.out.println("季節(jié)枚舉類中的對象:");
for (SeasonEnum seasonenum : seasonEnums) {
System.out.println(seasonenum);
}
System.out.println("****************************");
//線程狀態(tài)中的所有的枚舉的對象
Thread.State[] states = Thread.State.values();
System.out.println("線程狀態(tài)枚舉類中的對象:");
for (int i = 0; i < states.length; i++) {
System.out.println(states[i]);
}
System.out.println("****************************");
//valueOf方法
SeasonEnum winter = SeasonEnum.valueOf("WINTER");
System.out.println(winter);
}
}

實(shí)現(xiàn)接口的枚舉類
實(shí)現(xiàn)接口,在枚舉類中實(shí)現(xiàn)抽象方法
interface info {
void show();
}
enum SeasonEnumImplementsInterface1 implements info {
//提供當(dāng)前枚舉類的對象,之間使用","隔開,最后一個對象使用";"隔開
SPRING("春天", "春暖花開"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高氣爽"),
WINTER("冬天", "冰天雪地");
private final String seasonName;
private final String seasonDesc;
private SeasonEnumImplementsInterface1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
@Override
public void show() {
System.out.println("枚舉類實(shí)現(xiàn)了接口的抽象方法");
}
}

讓接口的每個枚舉對象都實(shí)現(xiàn)各自的方法
//枚舉的各個對象實(shí)現(xiàn)了接口的抽象方法
enum SeasonEnumImplementsInterface2 implements info {
//提供當(dāng)前枚舉類的對象,之間使用","隔開,最后一個對象使用";"隔開
SPRING("春天", "春暖花開") {
@Override
public void show() {
System.out.println("春天來了");
}
},
SUMMER("夏天", "夏日炎炎") {
@Override
public void show() {
System.out.println("夏天到了");
}
},
AUTUMN("秋天", "秋高氣爽") {
@Override
public void show() {
System.out.println("秋天來了");
}
},
WINTER("冬天", "冰天雪地") {
@Override
public void show() {
System.out.println("冬天來了");
}
};
private final String seasonName;
private final String seasonDesc;
private SeasonEnumImplementsInterface2(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}

public class EnumDemo4 {
@Test
public void test1(){
SeasonEnumImplementsInterface1[] SeasonEnumImplementsInterface1s = SeasonEnumImplementsInterface1.values();
System.out.println("季節(jié)枚舉類中的對象:");
for (SeasonEnumImplementsInterface1 seasonEnumImplementsInterface1:SeasonEnumImplementsInterface1s) {
System.out.println(seasonEnumImplementsInterface1);
seasonEnumImplementsInterface1.show();
}
}
@Test
public void test2(){
SeasonEnumImplementsInterface2[] SeasonEnumImplementsInterface2s = SeasonEnumImplementsInterface2.values();
System.out.println("季節(jié)枚舉類中的對象:");
for (SeasonEnumImplementsInterface2 seasonEnumImplementsInterface2:SeasonEnumImplementsInterface2s) {
System.out.println(seasonEnumImplementsInterface2);
seasonEnumImplementsInterface2.show();
}
}
}
注解
注解概述
在Java中,注解(Annotation)引入始于Java5,用來描述Java代碼的元信息,通常情況下注解不會直接影響代碼的執(zhí)行,盡管有些注解可以用來做到影響代碼執(zhí)行。
A
nnotation 其實(shí)就是代碼里的特殊標(biāo)記, 這些標(biāo)記可以在編譯, 類加載, 運(yùn)行時被讀取, 并執(zhí)行相應(yīng)的處理。通過使用 Annotation,程序員可以在不改變原邏輯的情況下, 在源文件中嵌入一些補(bǔ)充信息。
Annotation可以像修飾符一樣使用,可以用來修飾包、類、構(gòu)造器、方法、成員變量、參數(shù)、局部變量的聲明,這些信息被保存在Annotation的“name = value”對中。
在JavaSE中,注解的使用目的比較簡單,例如標(biāo)記過時的功能,忽略警告等。
一定的程度上可以說框架 = 注解 + 反射機(jī)制 + 設(shè)計模式
常見的注解
1.生成文檔相關(guān)的注解
2.在編譯的時候進(jìn)行格式的檢查
3.跟蹤代碼的依賴性,實(shí)現(xiàn)代替配置文件的功能
package AnnotationDemo;
/**
* 1.生成文檔相關(guān)的注解
* @author ypc
* @create 2021-06-22;
*/
public class AnnotationDemo1 {
}
class B implements A{
//2.在編譯的時候進(jìn)行格式的檢查
@Override
public void test() {
}
}
interface A{
void test();
}
/**
* 3.跟蹤代碼的依賴性,實(shí)現(xiàn)代替配置文件的功能
* 未使用注解的時候
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>service.RegServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
使用注解之后:
@WebServlet("/reg")
*/
總結(jié)
本篇文章的上半部分就到這里了,希望對你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring中@Transactional(rollbackFor=Exception.class)屬性用法介紹
這篇文章介紹了Spring中@Transactional(rollbackFor=Exception.class)屬性的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
java利用delayedQueue實(shí)現(xiàn)本地的延遲隊列
這篇文章主要給大家介紹了java利用delayedQueue實(shí)現(xiàn)本地的延遲隊列的相關(guān)資料,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04
Java實(shí)現(xiàn)時間與字符串互相轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)時間與字符串互相轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
Java基于Swing和netty實(shí)現(xiàn)仿QQ界面聊天小項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了Java如何利用Swing和netty實(shí)現(xiàn)仿QQ界面聊天小項(xiàng)目,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09
Java swing實(shí)現(xiàn)的計算器功能完整實(shí)例
這篇文章主要介紹了Java swing實(shí)現(xiàn)的計算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下2017-12-12
Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案
這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java數(shù)據(jù)結(jié)構(gòu)與算法之二分查找詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之二分查找詳解,二分查找算法是一種在有序數(shù)組中查找某一特定元素的搜索算法,其思想就是不斷地將有序查找表“一分為二”,逐漸縮小搜索區(qū)域,進(jìn)而找到目標(biāo)元素,需要的朋友可以參考下2023-12-12

