信息隐藏
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 12 课,共 87 课。
信息隐藏是一种限制直接访问对象内部数据的原则。将 private 字段与 getter 和 setter 结合起来,可以为对象的状态建立一道保护屏障。
想一想,如果没有信息隐藏,会发生什么:
public class Temperature {
public double celsius; // 直接对外暴露
}
// 任何人都可以设置无效的值
Temperature t = new Temperature();
t.celsius = -500; // 低于绝对零度,不可能!通过信息隐藏,你可以控制数据的访问和修改方式:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}现在,无效温度会被自动拒绝。内部表示被隐藏了,这样你以后可以更改温度在内部的存储方式(也许改用开尔文),而不会影响使用该类的代码。
这种方法有三个主要优点:验证可确保数据完整性,灵活性允许你在不破坏外部代码的情况下更改内部实现,控制则让你准确决定允许对数据执行哪些操作。
挑战
简单我们来创建一个 Password 管理类,通过保护敏感数据并通过受控访问强制执行安全规则,来演示信息隐藏。
你将创建两个文件来组织代码:
Password.java:创建一个 Password 类,隐藏内部数据,并控制密码的设置和访问方式:- 一个私有的
password字段(String),用于存储实际密码 - 一个私有的
minLength字段(int),用于定义可接受的最小密码长度 - 一个接收最小长度要求的构造函数
- 一个设置器
setPassword(String password),只接受达到最小长度要求的密码。如果密码有效,就存储密码并返回true;如果密码太短,就不更改密码并返回false - 一个获取器
getMaskedPassword(),返回将所有字符替换为星号(*)后的密码。绝不泄露实际密码! - 一个方法
checkPassword(String attempt),如果尝试输入的密码与存储的密码匹配,就返回true,否则返回false - 一个获取器
getLength(),返回当前密码的长度(如果未设置密码,则返回 0)
- 一个私有的
Main.java:创建一个最小长度为 6 的 Password 对象,然后读取两个输入:要设置的密码和要检查的尝试输入。打印三行:Set: true或Set: false(设置密码的结果)Masked: ******(密码的掩码版本)Match: true或Match: false(检查尝试输入的结果)
你将收到两个输入:要设置的密码,以及要检查的尝试输入。
注意,实际密码无法从类外部直接访问,这正是信息隐藏的体现。这个类会精确控制哪些信息可以被公开,以及如何修改密码。
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取要设置的密码
String passwordToSet = scanner.nextLine();
// 读取要检查的密码尝试值
String passwordAttempt = scanner.nextLine();
// TODO: 创建一个最小长度为 6 的 Password 对象
// TODO: 设置密码并打印结果("Set: true" 或 "Set: false")
// TODO: 打印遮盖后的密码("Masked: ******")
// TODO: 检查尝试输入的密码并打印结果("Match: true" 或 "Match: false")
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器