为什么需要枚举?
常量定义它不香吗?为啥非得用枚举?
静态常量:
/**
* 成功
*/
public static final int SUCCESS = 1;
/**
* 失败
*/
public static final int FAILURE = 0;
对于这种单值类型的静态常量定义,本身也没错,主要是在使用的地方没有一个明确性的约束而已
public void getCode(int code){
}
比如这里的 getCode
函数的本意是传入 code
的两种静态常量之一,但由于没有类型上的约束,因此传入任意一个int
值都是可以的,编译器也不会提出任何警告。
但是在枚举类型出现之后,上面这种情况就可以用枚举严谨地去约束,比如用枚举去定义视频状态就非常简洁了:
枚举类:
public enum TypeEnum {
/**
* 成功
*/
SUCCESS(1),
/**
* 失败
*/
FAILURE(0)
;
private final int code;
TypeEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
// 入参就有明确的约束
public void getCode(TypeEnum typeEnum){
}
这样在使用 getCode
函数时,入参类型就会受到明确的类型约束,一旦传入无效值,编译器就会帮我们检查,从而规避潜在问题。
除此之外,枚举在扩展性方面比普常量更方便、也更优雅。
枚举类型的常用方法
方法名 | 具体含义 | 使用方法 |
values() | 将枚举类型成员以数组的形式返回 | 枚举类.values() |
valueOf() | 将普通字符串转换为枚举实例 | 枚举类.valueOf(“ABC”) |
compareTo() | 比较两个枚举对象在定义时的顺序 | 枚举对象.compareTo() |
ordinal() | 得到枚举成员的位置索引 | 枚举对象.ordinal() |
values()方法
该方法可以将枚举类型成员以数组的形式返回,也可以通过该方法获取枚举类型的成员。
测试枚举类
package com.yang.enums;
/**
* @Author: chen yang
* @Date: 2021/12/17 11:26
* @Description: 颜色枚举类
*/
public enum ColorEnum {
/**
* 蓝色
*/
BLUE("blue", "我是蓝色"),
/**
* 红色
*/
RED("red", "我是红色"),
/**
* 黑色
*/
BLACK("black", "我是黑色"),
GREEN("green", "我是绿色");
/**
* 颜色
*/
private final String name;
/**
* 描述
*/
private final String description;
ColorEnum(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
/**
* 通过颜色获取描述
*
* @param name
* @return
*/
public static String getDescription(String name) {
for (ColorEnum color : ColorEnum.values()) {
if (color.name.equals(name)) {
return color.getDescription();
}
}
return null;
}
/**
* 通过颜色获取描述
*
* @param name
* @return
*/
public static String getDescription1(String name) {
return Arrays.stream(ColorEnum.values())
.filter(color -> Objects.equals(color.getName(), name))
.findFirst()
.map(ColorEnum::getDescription)
.orElse(null);
}
}
// 遍历枚举类
public static void main(String[] args) {
// 方式一
for (ColorEnum colorEnum : ColorEnum.values()) {
System.out.println("枚举类型成员变量:" + colorEnum);
}
System.out.println("------------------------");
// 方式二
for (int i = 0; i < ColorEnum.values().length; i++) {
System.out.println("枚举类型成员变量:" + ColorEnum.values()[i]);
}
}
valueOf()与compareTo()方法
枚举类型中静态方法valueOf()可以实现将普通字符串转换为枚举实例,而compareTo()方法用于比较两个枚举对象在定义时的顺序。
public static void main(String[] args) {
// 将字符串转换成枚举实例
ColorEnum black = ColorEnum.valueOf("BLACK");
System.out.println(black);
System.out.println("------------------------");
// 比较顺序关系
compare(black);
}
/**
* 比较两个枚举对象在定义时的顺序
* @param colorEnum
*/
public static void compare(ColorEnum colorEnum){
for (ColorEnum value : ColorEnum.values()) {
// compareTo()方法用于比较两个枚举对象在定义时的顺序
System.out.println(colorEnum + " 与 "+value + " 的比较结果为: "+colorEnum.compareTo(value));
}
}
说明:调用compareTo()方法返回的结果,正值代表方法中的参数在调用该方法的枚举对象位置之前;0代表两个相互比较的枚举成员的位置相同;负值代表方法中参数在调用该方法的枚举对象位置之后。
ordinal()方法
该方法用于得到枚举成员的位置索引。
public static void main(String[] args) {
// 获取枚举成员的位置索引
for (int i = 0; i < ColorEnum.values().length; i++) {
System.out.println(ColorEnum.values()[i] + "在枚举类型中位置索引值" + ColorEnum.values()[i].ordinal());
}
}
使用枚举类型的优势
枚举类型声明提供了一种用户友好的变量定义方法,枚举了某种数据类型所有可能出现的值。总结枚举类型,它具有以下特点:
(1)类型安全。
(2)紧凑有效的数据定义。
(3)可以和程序其他部分完美交互。
(4)运行效率高。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95919.html