+3

Hiểu rõ Access Modifiers trong 5 phút

Trong lập trình Java, Access Modifiers đóng vai trò quan trọng trong việc kiểm soát quyền truy cập vào các lớp, phương thức và thuộc tính của lớp. Việc sử dụng access modifiers không chỉ giúp bảo vệ dữ liệu mà còn hỗ trợ trong việc thiết kế các ứng dụng bền vững và dễ bảo trì. Trong bài viết này, chúng ta sẽ khám phá các khái niệm cơ bản về access modifiers, tính ứng dụng của chúng và minh họa bằng các ví dụ code.

Các Access Modifiers Trong Java

Java cung cấp bốn loại access modifiers chính, mỗi loại có 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 từ chính lớp đó. Các lớp khác, kể cả lớp con hoặc lớp nằm trong cùng package, không thể truy cập trực tiếp.
  • default (Ta cũng có thể gọi là package-private hoặc default accsess): Khi không sử dụng bất kỳ access modifier nào, thành phần đó sẽ có quyền truy cập mặc định (default). Nó chỉ có thể được truy cập từ các lớp khác 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 một package hoặc từ các lớp con (subclass) nằm ở 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, kể cả từ các lớp nằm ngoài package chứa lớp đó.

Bảng mô tả khả năng 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 Y N N N
Default Y Y N N
Protected Y Y Y N
Public Y Y Y Y

Hình ảnh minh họa

Tính Ứng Dụng Của Các Access Modifiers

  • Encapsulation (Đóng gói): 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 dữ liệu. Ví dụ, các thuộc tính trong lớp thường được khai báo là private, và các phương thức truy cập công khai (public getter và setter) được sử dụng để kiểm soát việc truy cập và cập nhật các thuộc tính này.
  • Inheritance (Kế thừa): Trong kế thừa, protected và public cho phép các lớp con truy cập các thuộc tính và phương thức từ lớp cha, trong khi private không thể được truy cập bởi các lớp con, bảo vệ các chi tiết triển khai bên trong lớp cha.

Ví Dụ Thực Tế: Quản Lý Tài Khoản Ngân Hàng

Bước 1: Tạo lớp BankAccount với thuộc tính số tài khoản khai báo là “private” và số dư được khai báo là “protected” để đảm bảo rằng chúng không thể được truy cập trực tiếp từ bên ngoài lớp.

public class BankAccount {
    // Thuộc tính private, không thể truy cập trực tiếp từ bên ngoài lớp
    private String accountNumber;
    protected double balance;

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }
}

Bước 2: Tạo các method "public" nạp tiền hoặc rút tiền trong class BankAccount để có thể truy cập từ bên ngoài (Từ đây chúng ta có thể viết thêm hàm bên trong để lưu lại lịch sử - đảm bảo tính toàn vẹn của dữ liệu, không được truy cập trái phép trực tiếp vào thuộc tính số tài khoản và số dư từ bên ngoài)

public class BankAccount {
    // Phương thức public để nạp tiền vào tài khoản
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited: $" + amount);
        } else {
            System.out.println("Invalid deposit amount");
        }
    }

    // Phương thức public để rút tiền từ tài khoản
    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: Tạo một class SpecialAccount từ bên ngoài kế thừa class BankAccount để truy cập và thay đổi biến "protected" balance

class SpecialAccount extends BankAccount {

    public SpecialAccount(double initialBalance) {
        super(initialBalance);
    }

    public void applySpecialOffer(double bonus) {
        balance += bonus; // Truy cập và thay đổi trực tiếp balance vì nó là protected
    }
}

Kết Luận

Access modifiers là một công cụ mạnh mẽ giúp quản lý quyền truy cập và bảo vệ dữ liệu trong các lớp Java. Bằng cách sử dụng chúng một cách hợp lý, bạn có thể thiết kế các lớp với tính đóng gói tốt, bảo vệ dữ liệu quan trọng và duy trì sự tổ chức và khả năng mở rộng của mã nguồn. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về các access modifiers trong Java và cách áp dụng chúng trong thực tiễn.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí