11.4 获取方法和设置方法

Time 类的实例变量是私有的,可在 Time 类中访问,但如果试图在其他类中访问它们,那么编译器将报错。

例如,下面是一个名为 TimeClient 的新类,之所以这样命名,是因为使用其他类定义的对象的类称为客户端(client):

  1. public class TimeClient {
  2. public static void main(String[] args) {
  3. Time time = new Time(11, 59, 59.9);
  4. System.out.println(time.hour); // compiler error
  5. }
  6. }

如果你尝试编译这些代码,将出现类似于下面这样的错误消息:hour has private access in TimeTime 类中的 hour 是私有的)。解决这种问题的办法有三种。

  • 将实例变量 hour 声明为公有的。

  • Time 类中提供访问其实例变量的方法。

  • 因为本来就要禁止其他类访问 Time 类的实例变量,所以这根本就不是问题。

第一种选择很有吸引力,因为它简单易行,但问题是如果类 A 直接访问类 B 的实例变量,那么类 A 将“依赖”于类 B。换而言之,每当你修改类 B 时,很可能也必须修改类 A。

如果类 A 只使用类 B 的方法来与类 B 交互,那么它们将是彼此“独立的”,这意味着修改类 B 不会影响类 A(只要类 A 使用的方法的特征标没有变化)。

因此,如果我们认为必须让 TimeClient 能够读取 Time 的实例变量,可在 Time 中提供执行这种任务的方法:

  1. public int getHour() {
  2. return this.hour;
  3. }
  4. public int getMinute() {
  5. return this.minute;
  6. }
  7. public int getSecond() {
  8. return this.second;
  9. }

这种方法的正规名称是“访问器”,但更常用的名称是获取方法(getter)。根据约定,获取实例变量 something 的方法将被命名为 getSomething

如果我们认为还必须让 TimeClient 能够修改 Time 的实例变量,也可在 Time 中提供执行这种任务的方法:

  1. public void setHour(int hour) {
  2. this.hour = hour;
  3. }
  4. public void setMinute(int minute) {
  5. this.minute = minute;
  6. }
  7. public void setSecond(int second) {
  8. this.second = second;
  9. }

这些方法的正规名称是“修改器”,但更常用的叫法是设置方法(setter)。设置方法的命名约定与获取方法类似:设置实例变量 something 的方法将被命名为 setSomething

编写获取方法和设置方法的工作可能很繁琐,但很多 IDE 都能够根据实例变量生成这些方法。