Java枚举
- Java 枚举是一个特殊的类,一般表示一组常量,使用
enum
关键字来定义。 - 实际使用中,会用枚举替代常量,这样有什么好处:
- 枚举方式定义的常量可以增强代码的可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。
- 举例:Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。我们统一将常用的颜色的常量放在一个枚举类型里面,避免了定义了常量。
public enum Color {
/**
* RED:红色
* GREEN:绿色
* BLUE:蓝色
*/
RED,
GREEN,
BLUE;
}
测试:
public class Demo {
public static void main(String[] args) {
System.out.println(Color.BLUE); //BLUE
System.out.println(Color.BLUE.name());//BLUE
System.out.println(Color.BLUE.name().getClass());//class java.lang.String
System.out.println(Color.BLUE.getClass());//class day1.Color
}
}
自定义枚举方法
在枚举上定义一些额外的API:
public class Color {
private ColorState colorState;
public Color(ColorState colorState) {
this.colorState = colorState;
}
public enum ColorState{
/**
* RED:红色
* GREEN:绿色
* BLUE:蓝色
*/
RED,
GREEN,
BLUE;
}
public boolean idRED(){
// 使用 == 比较枚举类型,不会引发NullPointerException (比较equals方法而言)
return getState() == ColorState.RED;
}
// 设置和获取状态变量的方法。
}
在 switch 中使用枚举类
public class Color {
private ColorState colorState;
public Color(ColorState colorState) {
this.colorState = colorState;
}
public enum ColorState{
/**
* RED:红色
* GREEN:绿色
* BLUE:蓝色
*/
RED,
GREEN,
BLUE;
}
public String getStateColor(){
switch (colorState){
case RED: return "红色";
case BLUE: return "蓝色";
case GREEN: return "绿色";
default: return "错误";
}
}
}
枚举类型的属性、方法和构造方法
public enum ResultCode {
/**
* 网页响应码
*/
SUCCESS(200){
@Override
public boolean isSuccess() {
return true;
}
},
FAIL(400),
UNAUTHORIZED(401),
NOT_FOUND(404),
INTERNAL_SERVER_ERROR(500);
public int code;
//构造方法
ResultCode(int code) {
this.code = code;
}
//方法
public boolean isSuccess(){
return false;
}
//其他类似
}
测试:
System.out.println(ResultCode.NOT_FOUND);//NOT_FOUND
System.out.println(ResultCode.NOT_FOUND.code);//404
System.out.println(ResultCode.NOT_FOUND.isSuccess());//false
System.out.println(ResultCode.SUCCESS.isSuccess());//true
枚举实现单例模式
查看博客:单例模式之枚举实现
实例
public enum ResultCode {
/**
* 网页响应码
*/
SUCCESS(200, "OK(成功)"),
FAIL(400, "Bad Request(错误请求)"),
UNAUTHORIZED(401, "Unauthorized(未授权)"),
NOT_FOUND(404, "Not Found(未找到)"),
INTERNAL_SERVER_ERROR(500, "Internal Server Error(内部服务器错误)");
private final int code;
private final String message;
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
return "ResultCode{" +
"code=" + code +
", message='" + message + '\'' +
'}';
}
}
System.out.println(ResultCode.SUCCESS.getCode());//200
System.out.println(ResultCode.SUCCESS.getMessage());//OK(成功)
System.out.println(ResultCode.NOT_FOUND.toString());//ResultCode{code=404, message='Not Found(未找到)'}