JavaBean必须有public无参构造、private字段、符合规范的getter/setter(boolean用isXxx)、实现Serializable并定义serialVersionUID;Lombok需显式加@NoArgsConstructor,IDE生成getter要勾选is前缀选项。

JavaBean 必须有无参构造方法,否则框架会报 InstantiationException
很多初学者写完类发现 Spring 或 Jackson 无法实例化,根本原因常是删掉了默认构造器,又没显式声明无参构造。只要类里定义了任意带参构造,编译器就不会自动生成无参构造——这是 Java 的硬规则。
- 必须显式写
public Person() {},哪怕内容为空 - 如果用了 Lombok,要加
@NoArgsConstructor;仅用@Data不够,它不包含无参构造 - 构造方法不能是
private或protected,反射调用要求public
getter/setter 命名必须严格匹配字段名,isXxx() 只适用于 boolean 类型
JavaBean 规范对方法签名极其敏感:字段叫 active,就必须用 isActive(),而不是 getActive();但字段叫 name,就只能是 getName() 和 setName(String)。大小写、前缀、返回类型错一个,Jackson、MyBatis 就可能读不到值。
-
boolean isValid→ 正确:isValid()/setValid(boolean);错误:getValid() -
Boolean isValid(包装类)→ 只能用getValid(),因为规范只对原始boolean认可isXxx - IDE 自动生成时注意勾选 “Use ‘is’ prefix for getters of boolean fields” 选项
字段必须是 private,且不能有 public 成员变量
一旦出现 public String name;,这个类就不是 JavaBean。封装性被破坏后,不仅违反规范,还会导致序列化/反序列化行为异常(比如 Jackson 默认跳过 public 字段,除非配置 Visibility)。
- 所有字段声明为
private,哪怕只是临时测试也别偷懒 - 不要用
public static final常量“打擦边球”,JavaBean 关注的是实例状态的封装 - Lombok 的
@Getter/@Setter生成的是 private 字段 + public 方法,符合要求
实现 Serializable 是隐式约定,不加会导致分布式场景下 NotSerializableException
虽然 JavaBean 规范文档没强制要求 Serializable,但所有主流框架(Spring Session、RedisTemplate、RMI)都默认依赖它做深拷贝或网络传输。漏掉这个接口,运行期才暴露问题,排查成本高。
- 加上
implements Serializable,并显式定义private static final long serialVersionUID = 1L; - 不建议用 IDE 自动生成的随机值,版本升级时需手动维护一致性
- 若类含不可序列化字段(如
ThreadLocal),要用transient修饰
JavaBean 看似简单,真正踩坑多在命名细节和访问控制上——尤其是 boolean 字段的 getter 前缀、无参构造的显式存在、以及 serialVersionUID 的实际必要性,这三点最容易被忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











