封装本身不直接提供安全性,而是通过访问控制(如private)、校验逻辑、不可变设计和包级限制等手段实现安全控制。
封装本身不直接提供“安全性”,但它通过限制访问、隐藏实现细节,为安全控制打下基础。Java中真正起作用的是访问控制机制(如private、public等)与合理设计的结合。
类的字段应默认设为private,避免外部直接读写。比如用户年龄不能被随意修改,就得拦在构造或setter里校验:
age声明为private int age;
setAge(int age)方法,在里面判断是否在合理范围(如0–150)getAge()也没关系——如果业务上不需要读取,就别暴露很多人以为加了getter/setter就是封装,其实关键在“有没有逻辑”。空壳方法等于没封:
public void setName(String name
) { this.name = name; }(未判空、未去前后空格)name != null && !name.trim().isEmpty(),再赋值setPassword(),不提供getPassword(),或返回null/"***"
基础类型用final可防重赋值;引用类型若指向可变对象(如ArrayList),需防御性拷贝:
private final String id; —— ID一旦设定就不许变List tags ,getTags()不应返回原引用,而应返回new ArrayList(this.tags)
Collections.unmodifiableList()包装后返回,更轻量且明确表达“只读”意图不加访问修饰符(即默认包私有)比public更安全,适合内部协作类:
public
module-info.java导出(exports)特定包,进一步约束可见范围基本上就这些。封装不是靠加个private就完事,而是围绕“谁该知道什么、谁能改什么”持续做判断。做得好,漏洞少一半。