枚举与包装类¶
枚举 enum¶
当你有一组固定的取值(订单状态、性别、角色),用枚举——比字符串常量安全得多。
enum Status {
PENDING("等待中"),
RUNNING("运行中"),
DONE("已完成");
private final String label;
Status(String label) { this.label = label; }
public String getLabel() { return label; }
}
Status s = Status.RUNNING;
switch (s) { case RUNNING: ... }
枚举的本质是个类:可以有字段、构造器、方法。前端对照:比 JS 的 Object.freeze({PENDING:'pending',...}) 强,因为它有类型、能挂方法、能 switch。
包装类¶
基本类型(int/double...)不是对象。需要对象形态时(比如集合里只能放对象、泛型要对象),用包装类:
| 基本类型 | 包装类 |
|---|---|
int |
Integer |
double |
Double |
long |
Long |
boolean |
Boolean |
char |
Character |
Integer boxed = 20; // 自动装箱 int → Integer
int n = boxed; // 自动拆箱
int parsed = Integer.parseInt("123"); // 字符串转数字(超常用)
★ 坑:Integer 用 == 比较¶
Integer a = 127, b = 127;
a == b; // true(Integer 缓存了 -128~127,命中缓存)
Integer c = 200, d = 200;
c == d; // false!超出缓存,是两个不同对象
c.equals(d); // true ✓
铁律:包装类比较内容一律用 .equals(),绝不用 ==。 这和第 04 章字符串的坑是同一个原理。
实战提示¶
- 数据库字段(状态、类型)映射成枚举,MyBatis-Plus 第三篇会用到。
- 前端传来的
"123"字符串转数字,用Integer.parseInt。 - 实体类的数值字段,
Integer(可 null)比int(默认 0)更合适——因为"未设置"和"0"是两回事。
完整可运行示例¶
package com.javaglm.language.ch12;
/**
* 第 12 章 · 枚举与包装类。
* 枚举(enum):类型安全的命名常量,本质是个特殊类,可带字段/方法。
* 包装类(Integer/Double...):把基本类型包成对象,提供转换工具方法。
*/
public class EnumWrapperDemo {
public static void main(String[] args) {
// 1. 枚举:取值固定、类型安全
Status s = Status.RUNNING;
System.out.println(s); // RUNNING
System.out.println(s.getLabel()); // 运行中
// 枚举很适合 switch
switch (s) {
case PENDING: System.out.println("等待中"); break;
case RUNNING: System.out.println("运行中"); break; // 命中
case DONE: System.out.println("已完成"); break;
}
// 2. 包装类:基本类型 ↔ 对象
Integer boxed = 20; // 自动装箱:int → Integer
int unboxed = boxed; // 自动拆箱:Integer → int
// 3. 包装类的实用方法(字符串转数字,前端常用场景)
int parsed = Integer.parseInt("123");
double d = Double.parseDouble("3.14");
System.out.println("parsed = " + parsed + ", d = " + d);
// 4. ★ 前端人坑:Integer 用 == 比较可能出错(有缓存范围 -128~127)
Integer a = 127, b = 127;
Integer c = 200, e = 200;
System.out.println("127 == 127 ? " + (a == b)); // true(命中缓存)
System.out.println("200 == 200 ? " + (c == e)); // false(超缓存,坑!)
System.out.println("200 equals 200 ? " + c.equals(e)); // true ✓
}
}
/** 枚举:本质是类,可以有字段、构造器、方法。 */
enum Status {
PENDING("等待中"),
RUNNING("运行中"),
DONE("已完成");
private final String label;
Status(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
:octicons-arrow-left-16: 上一章:异常处理 | 下一章:集合框架