核心是将状态变更严格限定在受控的公共方法中,通过私有字段+校验/转换/协调逻辑+私有步骤方法+内部类封装+安全读取,构建完整防护链。

核心在于:把状态变更的入口收束到少数可控方法里,所有修改都必须经过校验、转换和协调,而不是让外部代码直接碰字段。
私有字段是底线,不是终点
声明 private 字段只是第一步。它阻止了直接赋值(比如 account.balance = -100),但不等于逻辑就安全了。真正起作用的是——所有能改变这个字段的地方,都必须在类内部、且受控。
- 字段本身不可见,但得有配套的公共方法(如
deposit()、withdraw())作为唯一修改通道 - 这些方法内部要完成校验(金额是否为正)、状态检查(余额是否足够)、副作用处理(更新时间戳、发事件)
- 避免提供无条件的
setBalance()这类“裸写”方法,否则私有化就形同虚设
用私有方法封装具体操作步骤
一个状态更新往往不止一步。把每步拆成语义明确的私有方法,既便于测试,也防止逻辑被绕过。
-
_validateAmount(amount):只管参数合法性,不碰字段 -
_applyAdjustment(delta):只负责原子性更新余额和版本号,不做校验 -
_notifyChanged():统一触发事件,不暴露事件构造细节 - 公共方法如
refund()按顺序调用它们,形成一条不可跳过的执行链
配合内部类或私有嵌套类型强化边界
当一组操作高度依赖当前实例的私有状态,又需要独立行为时,成员内部类是个自然选择。
- 它天然持有外部类引用,可直接读写私有字段和调用私有方法
- 把内部类声明为
private,确保只有本类能创建其实例 - 外部只能通过本类提供的工厂方法(如
startEditing())获得该内部类对象,控制使用时机和上下文 - 比一堆零散的私有方法更清晰地表达“这一组操作属于一个协作单元”
敏感字段返回掩码或计算结果,而非原始值
读取也需控制。有些字段不该被外界拿到原始内容,比如密码、密钥、内部计数器。
-
getPassword()返回"***"或哈希摘要,而不是明文 -
getVersion()可返回只读副本或序列号,而非可变对象引用 - 类属性统计(如创建总数)用私有类字段 + 公有只读 getter,禁止外部写入
- 避免 getter 中暴露可变对象(如返回
new ArrayList(this.items)而非this.items)


















