Ẩn thông tin
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 12 trên 87.
Ẩn thông tin là nguyên tắc hạn chế truy cập trực tiếp vào dữ liệu bên trong của một đối tượng. Bằng cách kết hợp các trường private với các phương thức getter và setter, bạn tạo một lớp bảo vệ quanh trạng thái của đối tượng.
Hãy xem điều gì xảy ra khi không có tính ẩn thông tin:
public class Temperature {
public double celsius; // Cho phép truy cập trực tiếp
}
// Ai cũng có thể gán giá trị không hợp lệ
Temperature t = new Temperature();
t.celsius = -500; // Thấp hơn độ không tuyệt đối, điều này là không thể!Với tính năng ẩn thông tin, bạn kiểm soát cách truy cập và chỉnh sửa dữ liệu:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Giờ đây, các giá trị nhiệt độ không hợp lệ sẽ tự động bị từ chối. Cách biểu diễn bên trong được ẩn đi, sau này bạn có thể thay đổi cách lưu trữ nhiệt độ bên trong (có thể chuyển sang Kelvin) mà không ảnh hưởng đến code sử dụng lớp này.
Cách tiếp cận này có ba lợi ích chính: việc kiểm tra tính hợp lệ đảm bảo tính toàn vẹn của dữ liệu, tính linh hoạt cho phép thay đổi nội bộ mà không làm hỏng code bên ngoài, và quyền kiểm soát cho phép bạn quyết định chính xác những thao tác nào được phép thực hiện trên dữ liệu.
Thử thách
DễHãy tạo một lớp quản lý Password để minh họa tính che giấu thông tin bằng cách bảo vệ dữ liệu nhạy cảm và áp dụng các quy tắc bảo mật thông qua quyền truy cập được kiểm soát.
Bạn sẽ tạo hai tệp để sắp xếp code:
Password.java: Tạo lớp Password để che giấu dữ liệu nội bộ và kiểm soát cách đặt cũng như truy cập mật khẩu:- Một trường
passwordriêng tư (String) để lưu mật khẩu thực tế - Một trường
minLengthriêng tư (int) để xác định độ dài tối thiểu chấp nhận được của mật khẩu - Một hàm khởi tạo nhận yêu cầu về độ dài tối thiểu
- Một phương thức setter
setPassword(String password)chỉ chấp nhận mật khẩu đáp ứng yêu cầu về độ dài tối thiểu. Nếu hợp lệ, hãy lưu mật khẩu và trả vềtrue; nếu quá ngắn, không thay đổi mật khẩu và trả vềfalse - Một phương thức getter
getMaskedPassword()trả về mật khẩu với tất cả ký tự được thay bằng dấu hoa thị (*) - tuyệt đối không để lộ mật khẩu thực tế! - Một phương thức
checkPassword(String attempt)trả vềtruenếu mật khẩu nhập thử khớp với mật khẩu đã lưu, nếu không thì trả vềfalse - Một phương thức getter
getLength()trả về độ dài của mật khẩu hiện tại (hoặc 0 nếu chưa đặt mật khẩu)
- Một trường
Main.java: Tạo một đối tượng Password với độ dài tối thiểu là 6, sau đó đọc hai đầu vào: mật khẩu cần đặt và mật khẩu nhập thử cần kiểm tra. In ra ba dòng:Set: truehoặcSet: false(kết quả đặt mật khẩu)Masked: ******(phiên bản đã che của mật khẩu)Match: truehoặcMatch: false(kết quả kiểm tra mật khẩu nhập thử)
Bạn sẽ nhận hai đầu vào: mật khẩu cần đặt và mật khẩu nhập thử cần kiểm tra.
Lưu ý rằng mật khẩu thực tế không bao giờ có thể được truy cập trực tiếp từ bên ngoài lớp. Đây chính là cách tính che giấu thông tin hoạt động. Lớp kiểm soát chính xác thông tin nào được tiết lộ và cách mật khẩu có thể được thay đổi.
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc mật khẩu cần đặt
String passwordToSet = scanner.nextLine();
// Đọc mật khẩu nhập thử để kiểm tra
String passwordAttempt = scanner.nextLine();
// TODO: Tạo đối tượng (object) Password với độ dài tối thiểu là 6
// TODO: Đặt mật khẩu và in ra kết quả ("Set: true" hoặc "Set: false")
// TODO: In ra mật khẩu đã che ("Masked: ******")
// TODO: Kiểm tra mật khẩu nhập thử và in ra kết quả ("Match: true" hoặc "Match: false")
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online