11.4 获取方法和设置方法
Time 类的实例变量是私有的,可在 Time 类中访问,但如果试图在其他类中访问它们,那么编译器将报错。
例如,下面是一个名为 TimeClient 的新类,之所以这样命名,是因为使用其他类定义的对象的类称为客户端(client):
public class TimeClient {public static void main(String[] args) {Time time = new Time(11, 59, 59.9);System.out.println(time.hour); // compiler error}}
如果你尝试编译这些代码,将出现类似于下面这样的错误消息:hour has private access in Time(Time 类中的 hour 是私有的)。解决这种问题的办法有三种。
将实例变量
hour声明为公有的。在
Time类中提供访问其实例变量的方法。因为本来就要禁止其他类访问
Time类的实例变量,所以这根本就不是问题。
第一种选择很有吸引力,因为它简单易行,但问题是如果类 A 直接访问类 B 的实例变量,那么类 A 将“依赖”于类 B。换而言之,每当你修改类 B 时,很可能也必须修改类 A。
如果类 A 只使用类 B 的方法来与类 B 交互,那么它们将是彼此“独立的”,这意味着修改类 B 不会影响类 A(只要类 A 使用的方法的特征标没有变化)。
因此,如果我们认为必须让 TimeClient 能够读取 Time 的实例变量,可在 Time 中提供执行这种任务的方法:
public int getHour() {return this.hour;}public int getMinute() {return this.minute;}public int getSecond() {return this.second;}
这种方法的正规名称是“访问器”,但更常用的名称是获取方法(getter)。根据约定,获取实例变量 something 的方法将被命名为 getSomething。
如果我们认为还必须让 TimeClient 能够修改 Time 的实例变量,也可在 Time 中提供执行这种任务的方法:
public void setHour(int hour) {this.hour = hour;}public void setMinute(int minute) {this.minute = minute;}public void setSecond(int second) {this.second = second;}
这些方法的正规名称是“修改器”,但更常用的叫法是设置方法(setter)。设置方法的命名约定与获取方法类似:设置实例变量 something 的方法将被命名为 setSomething。
编写获取方法和设置方法的工作可能很繁琐,但很多 IDE 都能够根据实例变量生成这些方法。
