跳转至

枚举与包装类

枚举 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: 上一章:异常处理 | 下一章:集合框架