Java:枚举类型


每博一文案

师父说:人活一世,每个人都有他的特别,每个人都值得被温柔相待。红尘一遭,每段经历都有它的必然,
每段经历都造就了现在的你,最快乐的事情,就是做自己,最浪漫的事情,就是爱自己。致自己,这段话永不过期。
没有别人天生好命,就要学会后天自己拼命,没有别人可以依靠,就要学会独立创造幸福。
路,是靠自己一步一步走的,钱,是靠自己一分分赚的。财富,需要勤劳的付出,辉煌,需要顽强的拼搏。
心酸,苦酒,自己品尝,大风大浪自己挡,靠自己,最争气。
有些事,不能尽如意,有些情,不会久燃不熄,日久不一定生情,但一定能够见人心。
感情不是你对他好,他就会懂你的用心良苦。你再优秀,也会有人对你不屑一顾,
你再平凡,也会有人把你视若生命,捂不热的心,就不要暖了,等不到的人,就不要等了。
谁若真心待你,你就拿命去珍惜。谁若对你无情,你就报之以绝情。想要的人生自己赚,
满意的幸福自己争取,不亏待每一份热情,不讨好任何的冷漠。
愿你成为自己的太阳,也愿你的身后总有力量,你期待的一切,都会如约而至。
—————— 一禅心灵庙语

@

1. 枚举类型的介绍

一个 枚举类型 是一种特殊的数据类型,使一个变量是一组预定义的常量。变量必须等于一个已经预定义的值。常见的例子包括罗盘方向(NORTH、SOUTH、EAST 和 WEST 的值)和一周的几天。

因为它们是常量,枚举类型的字段的名称是大写字母。

对于类的对象有限,并且确定的,才可以使用 枚举类型 ,如:

  • 星期:Monday(星期一)、......、Sunday(星期天)

  • 性别:Man(男)、Woman(女)

  • 季节:Spring(春节)......Winter(冬天)

  • 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银 行卡)、CreditCard(信用卡)

  • 就职状态:Busy、Free、Vocation、Dimission

  • 订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、

  • Return(退货)、Checked(已确认)Fulfilled(已配货)、

  • 线程状态:创建、就绪、运行、阻塞、死亡

像 一天中是温度变化,就仅仅是在一个范围内,是有限的,但是却不是确定的

2. 自定义枚举类型

枚举类的实现:

JDK1.5 之前需要自定义枚举类。

JDK1.5 新增的 enum 关键字用于定义枚举类。

若枚举只有一个对象,则可以作为一种单例模式的实现方式。

枚举类的属性

  • 枚举类对象的属性不应允许被改动的,所以应该使用 private final 修饰
  • 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值,注意: 了 对于 final 修饰的属性/变量 必须赋值,如果不赋值,会报异常。
  • 若枚举类显式 的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
  • 私有化 类的构造器,保证不能在类的外部创建其对象,保证其 枚举类的安全性。
  • 在类的内部创建枚举类的实例。声明为 : public static final
  • 对象如果有实例变量,应该声明为 private final ,并在构造器中初始化。

举例: 基于 JDK5.0 之前的方式:自定义一个枚举类,一个关于四季的枚举类型。

package blogs.blog6;

class Season {
// 1.创建枚举类中的含有的特定的属性: 注意是被: private final 修饰的,也可以没有枚举类特有的属性
private final String stringName;
private final String stringDesc; // 2.创建枚举类常量: 注意是: public static final 修饰的,常量所有字母大写的
// 被 static 修饰,静态的和类一起加载到内存当中,仅仅只会加载一次,所以对象共用,可以直接使用 "类名.常量"的方式访问
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("冬天","冰天雪地"); // 3. 构造器私有化: 将枚举类定义的特定的被 final 修饰的属性,附上值。
// 注意: 被 final 修饰的属性/变量,必须赋值,不然报异常
private Season(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4. 其他诉求的方法的定义: 这里我们定义一个获取 属性的get方法
// 因为属性被 final 修饰了,所以我们不需要创建 set方法 public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} // 或者来一个重写 toString()方法 @Override
public String toString() {
return "Season{" +
"stringName='" + stringName + '\'' +
", stringDesc='" + stringDesc + '\'' +
'}';
}
} public class EnumTest {
public static void main(String[] args) {
// 访问自定义的枚举类型的常量,static 静态的,使用类名.常量名
System.out.println(Season.AUTUMN);
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.WINTER); } }

3. JDK 5.0 enum 定义枚举类

在 Java 编程语言中,基于 JDK5.0 的前提下,您可以使用 enum 关键字定义枚举类型。

使用说明:

  • 使用 enum 定义的枚举类 默认继承java.lang.Enum 类,因此不能再继承其他类。
  • 枚举类的构造器只能使用 private 权限修饰符。
  • 枚举类的所有实例必须在枚举类中显式列出(,分隔 ; 结尾). 列出的实例系统会 自动添加 public static final 修饰,
  • 对于枚举类中的常量必须定义声明在第一行枚举类对象。

举例: 基于上述:自定义一个枚举类,一个关于四季的枚举类型。上面我们使用的是在 JDK 5.0 之前自行定义的方式,这里我们基于 JDK 5.0以后的方式创建。

package blogs.blog6;

// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 { // 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的
// 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义 // 2. 定义枚举类型特有的属性
// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有
private final String stringName;
private final String stringDesc; // 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的
// final 必须赋值,不然报异常
private Season2(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4.处理特定的诉求 这里我们定义 get方法()
// 因为 特定的属性被 final 修饰了,所以不用定义 set的
public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} } public class EnumTest2 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
System.out.println(Season2.AUTUMN);
System.out.println(Season2.SUMMER);
System.out.println(Season2.WINTER);
} }

注意: 这里的 enum 类继承的不是 Object 类,而是 java.lang.Enum 类中的,所以 Season2.SPRING 枚举常量类中没有重写 toStirng()方法的前提下,调用的是 java.lang.Enum 类中的 toString()方法,返回的是 枚举常量名。 所以结果就如上图中的 : SPRING,AUTUMN,SUMMER,WINTER 的枚举常量名。

// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 { // 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的
// 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义 // 2. 定义枚举类型特有的属性
// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有
private final String stringName;
private final String stringDesc; // 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的
// final 必须赋值,不然报异常
private Season2(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4.处理特定的诉求 这里我们定义 get方法()
// 因为 特定的属性被 final 修饰了,所以不用定义 set的
public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} } public class EnumTest2 {
public static void main(String[] args) {
// 打印其中的 enum 的父类
System.out.println(Season2.class.getSuperclass());
}
}

JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举

类作为限定。

举例: 将指定一个星期的枚举类型为:

// 静态常量,导入对于特定的包,对于静态常量可以省略类名,直接使用常量名的方式
import static blogs.blog6.Day.SUNDAY; // 枚举类型也是可以被权限修饰符修饰的
enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY, // 枚举常量大写字母,必须定义在第一行当中,使用“,”逗号分隔开,
THURSDAY,
FRIDAY,
SATURDAY; // 最后“;” 分号结尾 } public class EnumTest3 {
public void tellItLikeItIs(Day day) {
switch (day) {
case MONDAY:
System.out.println("星期一是糟糕的");
break; case FRIDAY:
System.out.println("星期五是最爽的");
break; case SATURDAY:
case SUNDAY:
System.out.println("周末是最最安逸的");
break; default:
System.out.println("其他时间一般");
break;
}
} public static void main(String[] args) {
// 静态方法调用非静态方法
EnumTest3 enumTest3 = new EnumTest3();
enumTest3.tellItLikeItIs(Day.MONDAY);
enumTest3.tellItLikeItIs(Day.WEDNESDAY);
enumTest3.tellItLikeItIs(Day.FRIDAY);
enumTest3.tellItLikeItIs(Day.SATURDAY);
enumTest3.tellItLikeItIs(SUNDAY);
}
}

4. JDK5.0 enum 定义枚举类的常用方法

注意: 这里的方法是,基于 JDK5.0 enum 关键字定义的枚举类才有的方法。

  • values() 方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。这是一个静态方法/类方法 可以直接使用类名调用。

举例:

// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 { // 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的
// 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义 // 2. 定义枚举类型特有的属性
// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有
private final String stringName;
private final String stringDesc; // 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的
// final 必须赋值,不然报异常
private Season2(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4.处理特定的诉求 这里我们定义 get方法()
// 因为 特定的属性被 final 修饰了,所以不用定义 set的
public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} // 重写toString方法 @Override
public String toString() {
return "Season2{" +
"stringName='" + stringName + '\'' +
", stringDesc='" + stringDesc + '\'' +
'}';
}
} public class EnumTest2 {
public static void main(String[] args) {
Season2[] season2s = Season2.values(); // 返回枚举类中所有的常量值,存储到枚举类数组中 // 遍历获取到其中,枚举类数组
for(int i = 0; i < season2s.length; i++) {
System.out.println(season2s[i]); // 如果重写了toString()方法,就调用的是重写的toString()方法
}
}
}

  • valueOf(String str): 可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象中存在的“名字”。如不是,会有运行时异常:IllegalArgumentException。

举例:

// 使用JDK5.0 新特性中的定义枚举类关键字 enum
enum Season2 { // 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的
// 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
SPRING("春天", "春暖花开"), // 注意: 因为要定义在第一行,所以枚举常量之间使用","逗号分隔
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地"); // 最后使用,“;”分号结束 枚举常量的定义 // 2. 定义枚举类型特有的属性
// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有
private final String stringName;
private final String stringDesc; // 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的
// final 必须赋值,不然报异常
private Season2(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4.处理特定的诉求 这里我们定义 get方法()
// 因为 特定的属性被 final 修饰了,所以不用定义 set的
public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} // 重写toString方法 @Override
public String toString() {
return "Season2{" +
"stringName='" + stringName + '\'' +
", stringDesc='" + stringDesc + '\'' +
'}';
}
} public class EnumTest2 {
public static void main(String[] args) {
Season2 season2 = Season2.valueOf("SPRING"); // valueOf()类方法,返回对应枚举常量名的对象
System.out.println(season2);
}
}

如果不是 valueOf(String name) 参数的字符串名,必须是对应枚举类中所存在的枚举常量名,如果不是,报:java.lang.IllegalArgumentException 异常

  • toString():返回当前枚举类对象常量的名称。这个方法和我们以前的方法是一样的。

和普通 Java 类一样,枚举类可以实现一个或多个接口。若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,,则可以让每个枚举值分别来实现该方法。

举例: 这里我们定义一个 inof 接口,其中定义一个 show() 抽象方法, 再定义一个 enum 枚举类,实现该接口,并重写其中的 show()重写方法。做到每个枚举值(枚举常量值)在调用实现的接口 show()方法呈现出不同的行为方式,


interface Info {
public abstract void show(); } // enum 枚举类 implements 接口
enum Season5 implements Info { // 1. 首先将枚举类中的常量定义在第一行,如果不是定义在定义行的话,编译报错的
// 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
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("冬日,雪花飞舞");
}
}; // 最后使用,“;”分号结束 枚举常量的定义 // 2. 定义枚举类型特有的属性
// 注意: 被 private final 修饰防止被修改,这个根据需求设定就好,可以没有
private final String stringName;
private final String stringDesc; // 3. 私有化构造器(因为定义了枚举类特定的属性,所以需要额外定义构造器为其赋值),没有特定属性的话,可以省略的
// final 必须赋值,不然报异常
private Season5(String stringName, String stringDesc) {
this.stringName = stringName;
this.stringDesc = stringDesc;
} // 4.处理特定的诉求 这里我们定义 get方法()
// 因为 特定的属性被 final 修饰了,所以不用定义 set的
public String getStringName() {
return stringName;
} public String getStringDesc() {
return stringDesc;
} // 重写toString方法 @Override
public String toString() {
return "Season5{" +
"stringName='" + stringName + '\'' +
", stringDesc='" + stringDesc + '\'' +
'}';
}
} public class EnumTest5 {
public static void main(String[] args) {
Season5[] values = Season5.values(); // 静态方法/类方法:获取到对应枚举类中所有的枚举值(枚举常量值),并存储在数组中 for(int i = 0; i < values.length; i++) {
values[i].show(); // 调用对应枚举值(枚举常量值)中特有的方法
}
}
}

5. 总结:

  • 对于类的对象有限,并且确定的,才可以使用 枚举类型 。
  • 当需要定义一组常量时,强烈建议使用枚举类
  • JDK 5.0 定义枚举类的关键字 enum 其中枚举值,省略了 public static final Season 和 new Season的
    // 省略了 public static final Season 和 new Season的
// public static final Season SPRING = new Season("春天", "春暖花开");
SPRING("春天", "春暖花开"),
  • JDK5.0 enum 定义的枚举类中的枚举值(枚举常量值)必须在第一行中定义,不然编译无法通过。正是因为必须定义在第一行:所以每个枚举值(枚举常量值)之间使用 逗号"," 号分隔开,最后一个枚举值,使用“;” 分号结束。
  • JDK5.0 enum 定义的枚举类 和普通的类是一样的单继承,多接口实现。
  • JDK5.0 enum 定义的枚举类 的父类是 java.lang.Enum 抽象类,不是 Object 的类。
  • JDK5.0 enum 定义的枚举类 常用的三个方法 values(),valueOf()这两个都是静态方法。以及一个 toString()方法。

6. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!

Java:枚举类型的更多相关文章

  1. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  2. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  3. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  4. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  5. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  6. 【转载】Java枚举类型的使用

    枚举类型概念 package com.lxq.enumm; public class EnumDemoOne { private enum InnerEnum { RED, GREEN, YELLOW ...

  7. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  8. Java枚举类型使用示例

    Java枚举类型使用示例 学习了:https://www.cnblogs.com/zhaoyanjun/p/5659811.html http://blog.csdn.net/qq_27093465/ ...

  9. Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...

  10. java 枚举类型知识点记录

    在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum.枚举类型是由一组固定的常量组成的类型.枚举本质是int值.因为枚举类型没有可以访问的构造器,所以枚举类 ...

随机推荐

  1. Codeforces Round #832 (Div. 2) A-D

    比赛链接 A 题解 知识点:贪心. 我们考虑把正数和负数分开放,显然把负数和正数放在一起的结果不会更优. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <b ...

  2. C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)

    命名空间 概述 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用域中,可能会导致很多冲突.使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲 ...

  3. Go语言核心36讲33

    我们在前几次讲的互斥锁.条件变量和原子操作都是最基本重要的同步工具.在Go语言中,除了通道之外,它们也算是最为常用的并发安全工具了. 说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式 ...

  4. openstack单机部署 未完成

    注:centos8单机版 注:本次实验手动配置密码均为admin 环境准备:配置hosts文件 192.168.116.85为本机IP echo '192.168.116.85 controller ...

  5. 【第6篇】AI语音测试简介

    1.4 AI语音测试简介 AI语音测试是针对人工智能语音交互的测试,人工智能语音交互一般包含语音识别技术(ASR).自然语言处理技术(NLP)和语音合成技术(TTS)等3大部分,通俗地来讲AI语音测试 ...

  6. 一步一图带你深入理解 Linux 物理内存管理

    1. 前文回顾 在上篇文章 <深入理解 Linux 虚拟内存管理> 中,笔者分别从进程用户态和内核态的角度详细深入地为大家介绍了 Linux 内核如何对进程虚拟内存空间进行布局以及管理的相 ...

  7. python选课系统项目详解

    选课系统项目详解 选课系统简介及分析 选课系统架构设计分析 选课系统目录设计 管理员视图 注册 登录 创建学校 创建课程 创建讲师 学生视图 注册 登录 选择学校 选择课程 查看分数 教师视图 登录 ...

  8. Day22:多态详解

    方法的多态 1.1什么是多态? 指一个对象在不同时刻拥有不同的形态. 例:猫 cat=new 猫(): ​ 动物 animal=new 猫(): 多态建立的条件: 建立在继承的关系上: 有方法重写: ...

  9. redux原理分享

    概述 一个状态管理工具 Store:保存数据的地方,你可以把它看成一个容器,整个应用只能有一个 Store. State:包含所有数据,如果想得到某个时点的数据,就要对 Store 生成快照,这种时点 ...

  10. 【大数据面试】Flink 04:状态编程与容错机制、Table API、SQL、Flink CEP

    六.状态编程与容错机制 1.状态介绍 (1)分类 流式计算分为无状态和有状态 无状态流针对每个独立事件输出结果,有状态流需要维护一个状态,并基于多个事件输出结果(当前事件+当前状态值) (2)有状态计 ...