Getter和Setter方法在Java中广泛使用,看似简单,但不是所有人都能正确理解并实现这种方法。所以在本文中,我将深入探讨Java中的Getter和Setter方法——从基础到常见错误,再到最佳实践。

如果你已经掌握Getter/Setter方法基础知识,可以直接跳转到第4章节(系列之二和三),阅读关于常见错误和最佳实践相关内容。

1. 什么是Getter/Setter方法

Getter/Setter是Java中用于获取和更新一个变量的值的两个传统方法。

下面是含有一个私有变量及其getter/setter方法的简单类示例代码:

public class SimpleGetterAndSetter {
private int number;
public int getNumber() {
return this.number;
}
public void setNumber(int num) {
this.number = num;
}
}

该类定义了一个私有变量,number。因为变量number是私有的,所以该类以外的代码是无法直接访问这个变量的,如下所示:

SimpleGetterAndSetter obj = new SimpleGetterAndSetter();
obj.number = 10; // compile error, since number is private
int num = obj.number; // same as above

在外部代码为了获取和更新变量,而是应该使用getter方法getNumber(),和setter方法setNumber()。例如:

SimpleGetterAndSetter obj = new SimpleGetterAndSetter();
obj.setNumber(10); // OK
int num = obj.getNumber(); // fine

因此,getter方法是用于读取变量值,setter方法是用于更新变量值的。Getter/Setter方法在Java中又被称作accessor(访问器)和mutator(修改器)。

2. 为什么要使用Getter/Setter

通过使用getter/setter方法,可以控制以适当的方式访问和更新重要的变量,例如在一个指定范围内更新变量值。考虑下面一段setter方法:

public void setNumber(int num) {
if (num < 10 || num > 100) {
throw new IllegalArgumentException();
}
this.number = num;
}

这就保证了更新变量number的值始终在10到100之间。如果变量number的值可以直接被更新,则调用者可以设置为任意值:

obj.number = 3;

这便违反了number值在10到100之间的约束。当然,这不是我们希望发生的。因此,定义为私有类型以隐藏变量,并使用setter方法更新变量。

另一方面,getter方法是外部代码获取变量值的唯一途径:

public int getNumber() {
return this.number;
}

下图说明了这种情况:

getter-and-setter visual

Getter和Setter方法保护了变量不被外部代码调用者意外改变。

当一个变量被private修饰符修饰,并只能通过getter和setter方法访问,那么这个变量被封装。封装是OOP(Object-Oriented Programming面向对象编程)的一个基本原理,因此实现getter/setter方法是程序中强制封装的方式之一。

一些框架,如Hibernate,Spring,Struts等是通过Getter/Setter获取信息或注入框架代码。因此在集成这些框架的时候,就必须要提供Getter/Setter方法。

3. Getter/Setter方法命名规范

Getter/Setter方法的命名需要符合Java bean命名规范,当变量名为xxx时,Getter/Setter方法命名分别为getXxx()和setXxx()。例如变量名为name:

private String name;

则正确的getter/setter方法命名为:

public void setName(String name) { }
public String getName() { }

如果变量是boolean类型,则getter方法的命名可以是isXxx()或getXxx(),推荐优先选择前者。例如:

private boolean single;
public String isSingle() { }

下表所示为符合命名规范的getter/setter命名示例:

变量定义

Getter方法

Setter方法

int quantity
int getQuantity()
void setQuantity(int quantity)
String firstName
String getFirstName()
void setFirstName(String firstName)
Date birthday
Date getBirthday()
void setBirthday(Date bornDate)
boolean rich
boolean isRich()
boolean getRich()
void setRich(boolean rich)

系列文章