实体类中的数值变量推荐用基本类型还是封装类型?

130 阅读2分钟

Java 实体类(Entity Class) 中,数值变量通常推荐使用 封装类型(包装类,如 Integer , Long , Double ,而不是基本类型(如 int, long, double)。

为什么推荐使用封装类型?

  1. 支持 null 值,适合数据库交互

    1. 在数据库中,某些数值字段可能允许 NULL,如果实体类使用基本类型(如 int),那么 NULL 会自动变成默认值 0,可能导致业务逻辑错误。
    2. 示例:
    3. public class User {
          private int age; // 如果数据库 age 为空,默认值变成 0
      }
      
    4. 推荐改为:
    5. public class User {
          private Integer age; // 允许 null,符合数据库设计
      }
      
  2. 兼容 ORM 框架(如 MyBatis、JPA)

    1. ORM 框架(如 MyBatis、Hibernate、Spring Data JPA)通常将 null 作为未赋值的标志。如果使用基本类型(如 int),可能导致 默认值污染 数据。
    2. 例如:
    3. public class Order {
          private int discount; // 数据库为空时,可能变成 0
      }
      
    4. 修正:
    5. public class Order {
          private Integer discount; // 数据库为空时,Java 变量也为 null
      }
      
  3. 支持泛型、集合

    1. Java 集合(如 List<T> )不能存储基本类型,必须使用封装类型:
    2. List<Integer> numbers = new ArrayList<>(); // ✅ 推荐
      
  4. 支持 Optional ,避免 NullPointerException

    1. 在 Java 8 及以上,封装类型可以与 Optional 结合,减少 NullPointerException
    2. Optional<Integer> score = Optional.ofNullable(user.getScore());
      score.ifPresent(System.out::println);
      

什么时候使用基本类型?

  • 计算密集型场景,且保证变量不会为 null,可以使用 intdouble 等提高性能:
public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}
  • 计数器、索引等业务逻辑中必然存在的值
public class Product {
    private int stock; // 库存一般不会是 null
}

总结

使用情况推荐类型理由
数据库字段Integer, Long, Double避免 NULL -> 0 问题,兼容 ORM
对象属性(可能为 null)Integer, Long, Double业务层逻辑更安全
计数器、索引、计算逻辑int, long, double性能更优,不需要 null

最佳实践:

  • 数据库交互、ORM、集合用封装类型( Integer , Long
  • 计算、计数、不会为 null 的变量用基本类型( int , long