+3

Object và class trong Java (phần 3)

Modifier

Trong lập trình Java, visibility modifiers (còn được gọi là access modifiers) quyết định phạm vi truy cập của các thành phần trong một class. Có ba visibility modifiers chính: public, private, và protected, cùng với một visibility mặc định khi không chỉ định modifier nào. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về mỗi modifier và cách chúng ảnh hưởng đến việc quản lý truy cập trong Java.

Public Modifier

Khái Niệm

public là visibility modifier có phạm vi truy cập rộng nhất. Nếu một thành phần được đánh dấu là public, nó có thể truy cập từ mọi nơi, kể cả từ các class nằm ở các package khác.

public class PublicExample {
    public int publicVariable;
    
    public void publicMethod() {
        // code here
    }
}

Ví Dụ

Giả sử bạn đang phát triển một ứng dụng quản lý nhân viên trong một công ty. Với bài toán này, bạn có thể sử dụng public modifier để tạo ra một class Employee với các thành phần có thể truy cập từ bên ngoài để hiển thị thông tin nhân viên. Dưới đây là một ví dụ đơn giản:

public class Employee {
    // Public variables for simplicity (not recommended in practice)
    public String name;
    public int employeeId;
    public double salary;

    // Public constructor
    public Employee(String name, int employeeId, double salary) {
        this.name = name;
        this.employeeId = employeeId;
        this.salary = salary;
    }

    // Public method to display employee information
    public void displayInfo() {
        System.out.println("Employee ID: " + employeeId);
        System.out.println("Name: " + name);
        System.out.println("Salary: $" + salary);
    }
}

Trong đoạn code trên:

  • Các biến name, employeeId, và salary được đánh dấu là public, cho phép truy cập trực tiếp từ bên ngoài class Employee. Trong thực tế, việc sử dụng biến public không được khuyến khích do nó làm giảm tính encapsulation (đóng gói).
  • Constructor cũng được đánh dấu là public, giúp tạo ra một object Employee từ bên ngoài.
  • displayInfo là một phương thức public giúp hiển thị thông tin của nhân viên từ bên ngoài.

Private Modifier

Khái Niệm

private là modifier ngược lại với public. Nếu một thành phần được đánh dấu là private, nó chỉ có thể truy cập từ bên trong cùng một class.

public class PrivateExample {
    private int privateVariable;
    
    private void privateMethod() {
        // code here
    }
}

Ví Dụ

Giả sử bạn đang phát triển một ứng dụng quản lý tài khoản ngân hàng. Trong ngữ cảnh này, việc sử dụng private modifier có thể được áp dụng cho các thuộc tính nhạy cảm như số tài khoản, số dư, và thông tin cá nhân của khách hàng. Dưới đây là một ví dụ minh họa:

public class BankAccount {
    // Private variables to protect sensitive information
    private String accountNumber;
    private double balance;
    private String ownerName;

    // Private constructor to ensure valid initialization
    private BankAccount(String accountNumber, double initialBalance, String ownerName) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
        this.ownerName = ownerName;
    }

    // Public factory method to create an instance of BankAccount
    public static BankAccount createAccount(String accountNumber, double initialBalance, String ownerName) {
        // Additional validation logic can be added here
        return new BankAccount(accountNumber, initialBalance, ownerName);
    }

    // Public method to get the account balance
    public double getBalance() {
        return balance;
    }

    // Public method to deposit money into the account
    public void deposit(double amount) {
        // Additional validation logic can be added here
        balance += amount;
        System.out.println("Deposit of $" + amount + " successful. New balance: $" + balance);
    }

    // Public method to withdraw money from the account
    public void withdraw(double amount) {
        // Additional validation logic can be added here
        if (amount <= balance) {
            balance -= amount;
            System.out.println("Withdrawal of $" + amount + " successful. New balance: $" + balance);
        } else {
            System.out.println("Insufficient funds. Withdrawal failed.");
        }
    }
}

Trong đoạn code trên:

  • Các biến accountNumber, balance, và ownerName được đánh dấu là private, giữ thông tin nhạy cảm được bảo vệ và không thể trực tiếp truy cập từ bên ngoài class.
  • Constructor được đánh dấu là private, chỉ có thể được gọi bên trong class để đảm bảo rằng các đối tượng BankAccount chỉ được tạo ra thông qua phương thức createAccount.
  • Phương thức createAccount là một phương thức public có thể được gọi từ bên ngoài để tạo ra một tài khoản ngân hàng mới với các thông tin hợp lệ.

Trong ứng dụng thực tế, việc sử dụng private modifier giúp đảm bảo tính riêng tư và an toàn cho thông tin nhạy cảm của khách hàng.

Protected Modifier

Khái Niệm

protected là sự kết hợp giữa publicprivate. Nếu một thành phần được đánh dấu là protected, nó có thể truy cập từ bên trong cùng một class và từ các class con của nó.

public class ProtectedExample {
    protected int protectedVariable;
    
    protected void protectedMethod() {
        // code here
    }
}

Ví Dụ

Giả sử bạn đang phát triển một ứng dụng quản lý thư viện, và bạn có một class LibraryItem để biểu diễn các item trong thư viện, chẳng hạn như sách và đĩa CD. Trong bài toán này, protected modifier có thể được sử dụng để bảo vệ một số thông tin như số lượng tồn kho và thông tin chi tiết đặc biệt chỉ dành cho các class con của LibraryItem. Dưới đây là một ví dụ:

public class LibraryItem {
    private String title;
    private String author;
    private int stockQuantity;  // Quantity in stock

    public LibraryItem(String title, String author, int stockQuantity) {
        this.title = title;
        this.author = author;
        this.stockQuantity = stockQuantity;
    }

    // Protected method to update stock quantity, only accessible to subclasses
    protected void updateStock(int newStockQuantity) {
        // Additional validation logic can be added here
        this.stockQuantity = newStockQuantity;
        System.out.println("Stock quantity updated: " + this.stockQuantity);
    }

    // Public method to display information
    public void displayInfo() {
        System.out.println("Title: " + title);
        System.out.println("Author: " + author);
        System.out.println("Stock Quantity: " + stockQuantity);
    }
}

Trong đoạn code trên:

  • Biến stockQuantity được đánh dấu là private, nhưng phương thức updateStock lại được đánh dấu là protected. Điều này có nghĩa là chỉ các class con của LibraryItem mới có thể gọi và cập nhật trực tiếp giá trị của stockQuantity.
  • Phương thức displayInfo là một phương thức public cho phép bất kỳ class nào khác cũng có thể hiển thị thông tin cơ bản của LibraryItem.

Trong ứng dụng thực tế, protected modifier có thể được sử dụng để quản lý quyền truy cập giữa class cha và class con, đồng thời giữ cho các thông tin nhất định không được truy cập trực tiếp từ bên ngoài.

Đóng gói Data field

Đóng gói dữ liệu (Encapsulation) là một trong những nguyên tắc quan trọng của lập trình hướng đối tượng (OOP). Nó liên quan chặt chẽ đến việc sử dụng visibility modifiers để bảo vệ và quản lý truy cập vào các trường dữ liệu (data fields) của một class. Đóng gói giúp giấu đi chi tiết bên trong của một object và chỉ cho phép bên ngoài tương tác với nó thông qua các phương thức được công bố.

Dưới đây là một số khía cạnh quan trọng của đóng gói dữ liệu:

  1. Bảo vệ Dữ liệu

Khi một trường dữ liệu được đóng gói, nó có thể được bảo vệ khỏi việc truy cập trực tiếp từ bên ngoài class. Điều này giúp tránh được sự thay đổi không mong muốn của dữ liệu và đảm bảo rằng mọi tương tác với nó đều diễn ra thông qua các phương thức kiểm soát.

  1. Tính Bảo Mật

Bằng cách ẩn thông tin bên trong và chỉ công bố những gì cần thiết, đóng gói giúp tăng cường tính bảo mật của ứng dụng. Những thông tin quan trọng không được tiết lộ mà không thông qua các cổng thông tin được xác định.

  1. Tính Bảo Trì và Mở Rộng

Đóng gói dữ liệu giúp tạo ra giao diện ổn định giữa các thành phần trong một hệ thống. Nếu bạn muốn thay đổi cách dữ liệu được lưu trữ hoặc xử lý bên trong class, bạn có thể làm điều này mà không ảnh hưởng đến các phần khác của hệ thống.

  1. Tính Tương Thích

Đóng gói dữ liệu tạo ra một giao diện đồng nhất và giảm sự phụ thuộc trực tiếp giữa các class. Điều này làm tăng tính tương thích và khả năng tái sử dụng của code.

Ví dụ

public class BankAccount {
    private String accountNumber;
    private double balance;

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

    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        // Có thể thêm logic kiểm tra hợp lệ ở đây
        balance += amount;
    }

    public void withdraw(double amount) {
        // Có thể thêm logic kiểm tra hợp lệ ở đây
        if (amount <= balance) {
            balance -= amount;
        } else {
            System.out.println("Insufficient funds. Withdrawal failed.");
        }
    }
}

Trong ví dụ này, accountNumberbalance được đóng gói và chỉ có thể truy cập thông qua các phương thức getBalance, deposit, và withdraw. Điều này giúp kiểm soát và duy trì tính toàn vẹn của dữ liệu bên trong BankAccount.

Tổng kết

Trong bài viết này, chúng ta đã tìm hiểu về ba visibility modifiers chính trong Java là public, private, và protected. Mỗi modifier có vai trò quan trọng trong quản lý phạm vi truy cập và đảm bảo tính encapsulation.

  • public: Phạm vi truy cập rộng nhất, cho phép truy cập từ mọi nơi.
  • private: Chỉ cho phép truy cập từ bên trong cùng một class, bảo vệ thông tin nhạy cảm.
  • protected: Cho phép truy cập từ bên trong cùng một class và từ các class con.

Ngoài ra, chúng ta cũng đã xem một số ví dụ cụ thể về cách sử dụng mỗi modifier. Cuối cùng, ta thảo luận về ý nghĩa và lợi ích của đóng gói dữ liệu, một nguyên tắc quan trọng của lập trình hướng đối tượng, giúp bảo vệ và kiểm soát truy cập vào dữ liệu của một class.


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í