在 Java 实体类(Entity Class) 中,数值变量通常推荐使用 封装类型(包装类,如 Integer , Long , Double ) ,而不是基本类型(如 int, long, double)。
为什么推荐使用封装类型?
-
支持
null值,适合数据库交互- 在数据库中,某些数值字段可能允许
NULL,如果实体类使用基本类型(如int),那么NULL会自动变成默认值0,可能导致业务逻辑错误。 - 示例:
-
public class User { private int age; // 如果数据库 age 为空,默认值变成 0 } - 推荐改为:
-
public class User { private Integer age; // 允许 null,符合数据库设计 }
- 在数据库中,某些数值字段可能允许
-
兼容 ORM 框架(如 MyBatis、JPA)
- ORM 框架(如 MyBatis、Hibernate、Spring Data JPA)通常将
null作为未赋值的标志。如果使用基本类型(如int),可能导致 默认值污染 数据。 - 例如:
-
public class Order { private int discount; // 数据库为空时,可能变成 0 } - 修正:
-
public class Order { private Integer discount; // 数据库为空时,Java 变量也为 null }
- ORM 框架(如 MyBatis、Hibernate、Spring Data JPA)通常将
-
支持泛型、集合
- Java 集合(如
List<T>)不能存储基本类型,必须使用封装类型: -
List<Integer> numbers = new ArrayList<>(); // ✅ 推荐
- Java 集合(如
-
支持
Optional,避免NullPointerException- 在 Java 8 及以上,封装类型可以与
Optional结合,减少NullPointerException: -
Optional<Integer> score = Optional.ofNullable(user.getScore()); score.ifPresent(System.out::println);
- 在 Java 8 及以上,封装类型可以与
什么时候使用基本类型?
- 计算密集型场景,且保证变量不会为
null,可以使用int、double等提高性能:
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) ✅