在 Java 中,**封装(Encapsulation)**是面向对象编程的三大特性之一(封装、继承、多态)。用好封装的核心目标是:隐藏实现细节、暴露必要接口、保护对象状态、提高可维护性。
下面从原则、做法、常见误区、实战示例几个方面说明。
private 修饰成员变量public class User {
private String name;
private int age;
}
getter / setter 或业务方法暴露行为public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄不合法");
}
this.age = age;
}
❌ 错误用法:
user.getName().setXxx(); // 外部直接操作内部对象
✅ 更好方式:
user.changeName("Tom");
适合配置、值对象:
public final class Money {
private final int amount;
public Money(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
}
优点:
避免外部随意创建对象:
public class Order {
private Order() {}
public static Order create() {
return new Order();
}
}
或 Builder 模式:
Order order = Order.builder()
.price(100)
.count(2)
.build();
default(包私有)或 protectedclass InternalService {
void process() {}
}
❌ 贫血模型:
user.age++;
✅ 富血模型:
user.growUp();
→ 等于“公开字段”,毫无封装意义
public List<String> getList() {
return this.list; // 外部可修改
}
✅ 正确:
return Collections.unmodifiableList(list);
→ 破坏封装,难以维护
| 场景 | 建议 |
|---|---|
| DTO / VO | 可适度暴露字段 |
| 领域对象 | 强封装,行为内聚 |
| 工具类 | 私有构造 + 静态方法 |
| 配置类 | 不可变对象 |
| 服务类 | 隐藏实现,暴露接口 |
封装不是“加 private 和 getter”,而是“让别人用你的能力,而不是碰你的数据”。
如果你愿意,我可以:
你想从哪一块深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。