文章目录
- 1. 封装性(Encapsulation)
- 2. 验证与逻辑处理
- 3. 计算属性(Computed Properties)
- 4. **跟踪变化(Change Tracking)
- 5. 懒加载与延迟初始化(Lazy Initialization)
- 6. 兼容性与未来扩展
- 上代码实例说明
使用
get
和
set
访问器(也称为属性)而不是直接将类成员变量声明为
public
,有以下几个关键好处:
1. 封装性(Encapsulation)
- 封装是面向对象编程中的基本原则之一。通过将字段声明为私有(
private
)并提供公共的get
和set
方法,可以控制对这些字段的外部访问。这样,类内部可以隐藏其数据实现细节,外部代码不能随意修改或查看这些字段的值,从而提高了数据的安全性和完整性。
2. 验证与逻辑处理
- 在
set
访问器中,可以添加必要的验证逻辑,在设置字段值之前检查新值的有效性。例如,确保年龄不小于0,邮箱地址格式正确等。如果直接公开字段,就无法在赋值时进行这种控制。
3. 计算属性(Computed Properties)
get
方法可以用于返回基于多个私有字段或其他复杂逻辑计算得出的值,而不只是简单的字段读取。
4. **跟踪变化(Change Tracking)
- 当属性值发生变化时,可以在
set
方法内触发额外的操作,如通知其他组件属性已更新,或者记录属性更改历史。
5. 懒加载与延迟初始化(Lazy Initialization)
- 可以利用
get
方法实现懒加载,即只有在首次访问属性时才执行初始化操作,这有助于优化性能。
6. 兼容性与未来扩展
- 如果将来需要更改存储字段的方式(例如从一个简单字段变为一个复杂的计算结果或从数据库获取),只需修改属性的
get
和set
实现即可,无需改变所有访问该属性的客户端代码。
直接将类成员变量声明为public
虽然可以简单地实现对这些变量的读写操作,但会导致以下问题:
上代码实例说明
假设有一个 Person
类,其中包含年龄(age)属性。
// 直接使用 public 成员变量的例子
public class PersonWithoutGetSet {
public int age;
}
在上面的例子中,任何访问到这个 PersonWithoutGetSet
对象的地方都可以随意修改其年龄,甚至可能会出现不合理的情况,例如:
PersonWithoutGetSet person = new PersonWithoutGetSet();
person.age = -10; // 任何人都可以直接设置一个负数作为年龄,这是不合理的
现在我们使用 get
和 set
方法来改进这个问题:
public class PersonWithGetSet {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int newAge) {
if (newAge >= 0 && newAge <= 150) { // 添加了合理性验证逻辑
this.age = newAge;
} else {
throw new IllegalArgumentException("Age must be between 0 and 150.");
}
}
}
在这个例子中,通过 setAge()
方法,我们可以确保传入的年龄值是合理的。如果外部尝试设置一个非法的年龄值,将会抛出异常,而不是任由数据错误发生。
此外,将来如果需要在赋值时触发额外的操作,比如更新相关的数据库记录或者触发状态改变事件等,可以在 setAge()
方法内部添加相应的代码,而无需改动调用该方法的所有地方。
因此,使用 get
和 set
方法能够增强封装性、提供数据验证以及支持未来的功能扩展,这些都是直接使用 public
变量无法带来的好处。
综上所述,虽然直接使用public
字段提供了简洁的访问方式,但在实际开发中,尤其是在设计稳健、可维护的软件系统时,使用get
和set
属性能更好地实现数据封装,增强代码的稳定性和灵活性。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛