Trong lập trình Java, Access Modifiers đóng vai trò thiết yếu trong việc kiểm soát quyền truy cập đối với các lớp, phương thức và thuộc tính. Việc sử dụng hiệu quả access modifiers không chỉ tăng cường bảo mật cho dữ liệu mà còn hỗ trợ thiết kế các ứng dụng bền vững, dễ bảo trì. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết về access modifiers, cách áp dụng chúng, và minh họa qua các ví dụ cụ thể.
Các Access Modifiers trong Java
Java cung cấp bốn loại access modifiers cơ bản, mỗi loại có những đặc điểm và mức độ truy cập khác nhau:
- private: Thành phần được đánh dấu là private chỉ có thể được truy cập bởi chính lớp đó. Các lớp khác, bao gồm các lớp con hay lớp nằm trong cùng một package, không có quyền truy cập trực tiếp.
- default (hay còn gọi là package-private): Khi không chỉ định access modifier nào, thành phần đó sẽ mặc định có quyền truy cập chỉ trong cùng một package.
- protected: Thành phần được đánh dấu là protected có thể được truy cập trong cùng package và từ các lớp con (subclass) thuộc các package khác.
- public: Thành phần được đánh dấu là public có thể được truy cập từ bất kỳ đâu, bao gồm cả từ các lớp nằm ngoài package.
Bảng Mô Tả Quyền Truy Cập của Access Modifiers
Access Modifier | Trong lớp | Trong package | Ngoài package bởi lớp con | Ngoài package |
---|---|---|---|---|
Private | Có | Không | Không | Không |
Default | Có | Có | Không | Không |
Protected | Có | Có | Có | Không |
Public | Có | Có | Có | Có |
Tính Ứng Dụng Của Các Access Modifiers
- Đóng Gói (Encapsulation): Access modifiers giúp kiểm soát việc truy cập và sửa đổi dữ liệu, từ đó bảo vệ tính toàn vẹn của nó. Ví dụ, các thuộc tính trong lớp thường được khai báo là private, và kèm theo các phương thức công khai (public getter và setter) để điều khiển việc cập nhật và truy cập.
- Kế Thừa (Inheritance): Trong trường hợp kế thừa, các access modifiers protected và public cho phép lớp con truy cập các thuộc tính và phương thức từ lớp cha, trong khi private hạn chế quyền truy cập từ lớp con, giúp bảo vệ chi tiết bên trong.
Ví Dụ Minh Họa: Quản Lý Tài Khoản Ngân Hàng
Bước 1: Tạo lớp BankAccount
Khởi tạo lớp BankAccount với các thuộc tính như số tài khoản là private và số dư là protected, nhằm đảm bảo rằng các thuộc tính này không thể bị truy cập từ bên ngoài lớp.
java
public class BankAccount {
private String accountNumber; // Số tài khoản - private
protected double balance; // Số dư - protected
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
}
Bước 2: Tạo các phương thức công khai để nạp/rút tiền
Thêm các phương thức public cho phép người dùng nạp tiền và rút tiền từ tài khoản. Điều này đảm bảo dữ liệu không bị truy cập trái phép và mọi thay đổi đều được kiểm soát.
java
public class BankAccount {
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("Deposited: $" + amount);
} else {
System.out.println("Invalid deposit amount");
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("Withdrew: $" + amount);
} else {
System.out.println("Invalid withdrawal amount or insufficient funds");
}
}
}
Bước 3: Kế thừa từ lớp BankAccount
Tạo một lớp SpecialAccount kế thừa từ lớp BankAccount để truy cập và điều chỉnh biến balance (protected).
java
class SpecialAccount extends BankAccount {
public SpecialAccount(double initialBalance) {
super(initialBalance);
}
public void applySpecialOffer(double bonus) {
balance += bonus; // Trực tiếp truy cập vào balance vì nó protected
}
}
Kết Luận
Access modifiers là công cụ mạnh mẽ để quản lý quyền truy cập và bảo vệ dữ liệu trong Java. Bằng cách áp dụng hợp lý các modifiers này, bạn có thể thiết kế các lớp với tính đóng gói cao, bảo vệ dữ liệu quan trọng và duy trì tính tổ chức cũng như khả năng mở rộng của mã nguồn. Hy vọng bài viết này đã giúp bạn nắm vững khái niệm về access modifiers trong Java và cách áp dụng chúng một cách hiệu quả trong thực tế.
source: viblo