Java中的一些概念
# Java中的一些概念
# 三大特性
Java的三大特性 面向对象三大特性:封装、继承、多态。 关于封装,可能脑子里立刻就会想到getter 和 setter。在上学时或者一些教材中也说了,类的属性如果要访问,不能直接 Object.field通过这种方式。
而是要——使用访问器方法(getter 和 setter)的主要好处之一就是封装性,它可以隐藏类的内部实现细节。通过封装,可以保护类的内部状态,防止外部代码直接修改这些状态
,从而确保类的行为符合设计意图。
但实际开发中,对于类中的 getter 和 setter,往往都是直接赋值跟获取值,似乎跟 Object.field这种方式没什么差别,导致部分人忘记——可以保护类的内部状态,防止外部代码直接修改这些状态
,这段话的含义。那接下来就用一个例子来展示下:
# 例子:银行账户类
假设我们有一个 BankAccount
类,它有三个字段:accountNumber
(账号)、balance
(余额)和 ownerName
(账户持有人姓名)。我们希望限制对这些字段的直接访问,并在设置和获取这些字段时添加一些逻辑。
# 不使用访问器的方法
如果我们不使用访问器方法,而是直接暴露字段,那么代码可能是这样的:
public class BankAccount {
public String accountNumber;
public double balance;
public String ownerName;
public BankAccount(String accountNumber, String ownerName) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
}
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount("123456789", "Alice");
account.balance = -100; // 这样直接修改 balance 是不安全的
System.out.println(account.balance); // 输出 -100
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在这个例子中,balance
字段可以被任意修改,即使修改后的值不符合实际(例如,余额不能为负数)。这样直接暴露字段会导致潜在的问题。
# 使用访问器方法
如果我们使用访问器方法(getter 和 setter),那么可以更好地控制对这些字段的访问,并在必要时添加验证逻辑:
public class BankAccount {
private String accountNumber;
private double balance;
private String ownerName;
public BankAccount(String accountNumber, String ownerName) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
}
public String getAccountNumber() {
return accountNumber;
}
public double getBalance() {
return balance;
}
public String getOwnerName() {
return ownerName;
}
public void setBalance(double balance) {
if (balance < 0) {
throw new IllegalArgumentException("Balance cannot be negative.");
}
this.balance = balance;
}
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount("123456789", "Alice");
try {
account.setBalance(-100); // 抛出异常
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
System.out.println(account.getBalance()); // 输出 0 或者默认初始值
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 封装性的具体体现
在这个例子中,使用访问器方法带来的封装性体现在:
- 隐藏内部实现细节:外部代码只能通过
getBalance()
和setBalance()
方法访问balance
字段,而不能直接修改它。这样,如果将来需要更改balance
字段的实现方式(例如,添加额外的状态或逻辑),外部代码不需要做出任何改动。 - 验证逻辑:在
setBalance()
方法中,我们可以添加逻辑来验证传入的值是否合法。例如,在上面的例子中,我们检查余额是否为负数,如果是,则抛出异常。这样可以确保账户的余额始终处于合法状态。 - 日志记录和监控:在访问器方法中可以轻松添加日志记录或性能监控的逻辑。例如,在
setBalance()
方法中记录每次余额变更的日志。 - 扩展性:如果未来需要在设置余额时执行额外的操作(如发送通知、记录交易历史等),只需在
setBalance()
方法中添加相应的逻辑即可,而无需修改使用该方法的代码。
通过使用访问器方法,我们可以更好地控制类的状态,并使代码更加健壮和易于维护。
上次更新: 2024/12/01, 14:58:26