Java中getter和setter方法的作用
Java中getter和setter方法的作用
在Java中,getter和setter方法是面向对象编程中实现封装的核心手段,它们的作用不仅限于访问或修改对象的属性,还为代码的灵活性、安全性和可维护性提供了重要保障。以下是其核心作用的详细说明:
idea快捷键:alt加insert加enter,选择getter和setter方法即可
一、核心作用
1. 实现封装(Encapsulation)
- 隐藏内部实现:将类的属性设为
private,外部只能通过public方法(getter/setter)访问,避免直接操作属性带来的不可控风险。 - 控制访问权限:
- 只读属性:仅提供
getter方法(如id)。 - 只写属性:仅提供
setter方法(如密码修改后触发日志)。 - 条件访问:通过方法逻辑限制访问(如管理员权限校验)。
- 只读属性:仅提供
2. 数据校验与逻辑处理
-
输入验证:在
setter中校验数据合法性。public void setAge(int age) { if (age < 0) { throw new IllegalArgumentException("年龄不能为负数"); } this.age = age; } -
副作用触发:
- 数据修改时自动更新缓存或通知观察者(如观察者模式)。
- 日志记录或审计跟踪。
3. 支持计算属性与延迟加载
-
动态计算值:
getter可返回计算后的值,而非直接存储。public int getBirthYear() { return Calendar.getInstance().get(Calendar.YEAR) - this.age; } -
延迟加载(Lazy Loading):首次访问时加载资源,减少开销。
private List<String> data; public List<String> getData() { if (data == null) { data = loadDataFromDatabase(); // 按需加载 } return data; }
4. 兼容框架与规范
- JavaBean规范:要求属性通过
getXxx()和setXxx()访问,供反射工具(如Spring、Hibernate)识别。 - 序列化控制:某些序列化库(如Jackson)依赖getter方法生成JSON字段。
5. 支持多态与继承
-
方法重写:子类可重写
getter/setter,扩展或修改行为。// 父类 public class Shape { protected int width; public int getWidth() { return width; } } // 子类重写,添加单位转换 public class Circle extends Shape { @Override public int getWidth() { return width * 2; // 返回直径 } }
二、最佳实践
1. 命名规范
getter:public 返回类型 get属性名()(布尔类型可用is属性名())。setter:public void set属性名(参数类型 参数)。
2. 避免过度暴露
- 仅暴露必要的属性,非必要字段无需提供公共访问方法。
- 使用
private或包级私有的setter限制修改范围。
3. 性能优化
- 频繁调用的
getter避免复杂计算,可缓存结果。 - 线程安全场景下,使用
synchronized或原子类(如AtomicInteger)。
三、示例代码
public class User {
private String name;
private int age;
private String email;
// Getter for name
public String getName() {
return name;
}
// Setter for name with validation
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
this.name = name.trim();
}
// Getter for age
public int getAge() {
return age;
}
// Setter for age with validation
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄无效");
}
this.age = age;
}
// Read-only email (仅内部可修改)
public String getEmail() {
return email;
}
private void setEmail(String email) {
this.email = email;
}
}
四、总结
getter和setter是Java封装的基石,它们通过控制数据访问、添加业务逻辑和支持扩展性,使代码更加健壮和灵活。在设计和实现时,需根据业务需求平衡封装性与便捷性,避免暴露不必要的细节。
浙公网安备 33010602011771号