Java类名必须与文件名一致且首字母大写;公共类需严格匹配文件名(如UserService.java),使用PascalCase命名,避免模糊缩写;成员变量私有化并配getter/setter,布尔字段用isXxx(),集合getter返回不可变视图;构造器应覆盖常用路径,显式提供无参构造器以支持框架;equals()、hashCode()、toString()必须重写,且符合规范。

类名必须与文件名一致且首字母大写
Java强制要求公共类(public class)的名称必须和源文件名完全相同,包括大小写。比如定义了 public class UserService,就必须保存为 UserService.java。如果类不是 public,则无此限制,但不推荐——因为无法被其他包直接访问,失去封装意义。
常见错误是命名用下划线(如 user_service.java)或小写开头(如 user.java),编译时会报错:class UserService is public, should be declared in a file named UserService.java。
- 类名使用 PascalCase(驼峰大写),如
OrderProcessor、HttpConfigBuilder - 避免缩写模糊的类名,如
Mgr、Util;优先用Manager、Configuration - 一个
.java文件里最多只能有一个public类
成员变量应私有化并配 getter/setter
标准 Java 类中,所有字段(private)不应暴露给外部,哪怕只是读取也应通过 public 方法控制。这不是教条,而是为后续加校验、日志、懒加载等留出扩展点。
例如 private String email; 后直接暴露 public String getEmail() 是基础;但如果未来需要校验邮箱格式,只需改方法体,调用方完全无感。
立即学习“Java免费学习笔记(深入)”;
- 不要用
public或protected修饰实例变量(除非是static final常量) - 布尔字段建议用
isXxx()而非getXxx(),如isActive();这是 JavaBeans 规范,框架(如 Jackson、Spring)依赖它做属性绑定 - 对集合类字段,getter 应返回不可变视图(如
Collections.unmodifiableList(list)),防止外部误修改内部状态
构造方法要覆盖常用初始化路径
没有显式定义任何构造方法时,编译器会自动添加一个无参 public 构造器;但只要写了任意一个构造方法,这个默认构造器就消失了。这意味着:如果你希望支持无参创建(比如 ORM 映射、JSON 反序列化),就必须手动保留它。
典型陷阱是只写了一个全参构造器,结果 Spring 报 No default constructor found,或 Jackson 解析时报 Cannot construct instance of Xxx。
- 优先提供无参构造器 + 全参构造器(或 Builder 模式)
- 参数校验放在构造方法内,而非 setter 中;对象一旦创建就应处于有效状态
- 避免在构造器中调用可被子类重写的方法(
this.doInit()),可能触发未初始化字段的访问
重写 equals()、hashCode() 和 toString() 是标配
这三个方法不是“可选增强”,而是实际开发中高频使用的契约方法。没重写 equals() 和 hashCode(),会导致对象放进 HashSet 或作为 HashMap key 时行为异常;没重写 toString(),日志打印全是 com.example.User@1a2b3c,排查困难。
IDE(如 IntelliJ)能自动生成,但要注意:字段选择必须反映业务意义上的“相等性”。比如 User 类通常用 id 判断相等,而不是 name 和 email 的组合。
-
equals()必须满足自反性、对称性、传递性、一致性,且对null返回false -
hashCode()必须保证:若a.equals(b)为true,则a.hashCode() == b.hashCode() - 生成
toString()时排除敏感字段(如密码)、大对象(如 byte[])、循环引用字段(如 parent/children)
equals() 中对业务主键的准确选取——这两处出问题,往往要等到集成测试甚至线上才暴露。










