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方法,可以控制以适当的方式访问和更新重要的变量,例如在一个指定范围内更新变量值??悸窍旅嬉欢蝧etter方法:
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和Setter方法?;ち吮淞坎槐煌獠看氲饔谜咭馔飧谋洹?/p>
当一个变量被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) |