在编写代码的时候,我们经常面临一个选择:是直接使用public字段,还是通过getter和setter方法来访问类的属性。这个问题看似简单,却隐藏着编程世界深深的智慧。今天,就让我们一起探索为什么在很多情况下,选择使用getter和setter方法会是一个更明智的决定。
举个简单的例子,假设我们有一个学生类,其中有一个字段用来存储学生的名字:
public class Student {
public String name;
}
在上面的代码中,name
字段被标记为public
,这意味着任何人都可以直接访问和修改这个字段。乍一看,这似乎非常方便。但是,想象一下如果后来我们想要在设置学生名字的时候,加上一些逻辑,比如验证名字是否为空,或者是否过长。如果我们直接暴露了name
字段,那么修改这部分逻辑就会变得非常麻烦,因为所有直接访问name
字段的代码都需要被找出来并修改。
这时,使用getter和setter就展现出了它的优势:
public class Student {
private String name; // 将字段设为私有
// 提供一个public的方法来设置name,这样我们就可以在这里加入逻辑
public void setName(String name) {
if(name == null || name.isEmpty()) {
throw new IllegalArgumentException("名字不能为空");
}
if(name.length() > 100) {
throw new IllegalArgumentException("名字过长");
}
this.name = name;
}
// 提供一个public的方法来获取name
public String getName() {
return name;
}
}
在这个改进后的版本中,我们将name
字段设为了private
,这意味着外部代码不能再直接访问它。相反,我们提供了setName
和getName
方法。这样,我们就可以在setName
方法中加入任何逻辑,比如验证名字是否合法,而不用担心会破坏其他依赖于这个字段的代码。如果将来我们想要修改这部分逻辑,只需要修改setName
方法就可以了。
除了提供验证的功能之外,使用getter和setter还有其他几个优点:
- 封装性:我们可以隐藏内部的实现细节,只暴露必要的接口给外部使用。
- 灵活性:如果将来类的内部结构发生变化,我们可以不改变getter和setter的签名,就能实现功能的更新,这对于保持代码的稳定性非常重要。
- 控制:我们可以控制字段的读写权限,比如只提供getter而不提供setter,就可以使得字段只读。
总之,虽然使用getter和setter方法看起来比直接访问public字段需要写更多的代码,但它们提供的好处远远超过了这点小小的不便。通过使用getter和setter,我们的代码会更加健壯、灵活,而且易于维护。所以,下次当你在考虑是否要为你的字段直接提供public访问权限时,不妨再想一想,使用getter和setter可能会是一个更好的选择哦!