Anonymous Inner Class: 'Tình Một Đêm' Của Java OOP?
Java – OOP

Anonymous Inner Class: 'Tình Một Đêm' Của Java OOP?

Author

Admin System

@root

Ngày xuất bản

21 Mar, 2026

Lượt xem

2 Lượt

Anonymous Inner Class

Chào các bạn Gen Z, hôm nay chúng ta sẽ cùng anh Creyt 'bóc phốt' một khái niệm nghe có vẻ 'khó nhằn' nhưng thực ra lại rất 'chill' trong Java OOP: Anonymous Inner Class.

Tưởng tượng thế này: bạn đang cần một shipper để giao đúng một món hàng duy nhất. Thay vì phải tuyển hẳn một nhân viên chính thức, ký hợp đồng, đào tạo đủ kiểu rồi mới giao, thì bạn chỉ cần 'ới' một anh shipper Grab/Shopee Food đang chạy ngang qua, nhờ anh ấy giao luôn. Xong việc là đường ai nấy đi, không ràng buộc, không tên tuổi gì cả. Đó chính là Anonymous Inner Class đó các em!

Nói cách khác, nó là một class 'vô danh tiểu tốt', không có tên rõ ràng. Chúng ta định nghĩa nó, khởi tạo nó, và dùng nó NGAY LẬP TỨC tại chỗ, chỉ cho một mục đích cụ thể, rồi thôi. Kiểu như 'tình một đêm' của các class vậy, đến rồi đi trong chớp mắt, không cần cam kết gì nhiều.

Mục đích chính? Là để thực hiện một interface hoặc kế thừa một abstract class (hoặc thậm chí một class cụ thể) cho những tác vụ nhỏ, một lần, không cần phải tạo hẳn một file .java riêng cho nó.

Code Ví Dụ Minh Hoạ: "Shipper Vô Danh" Hành Động

Để các em dễ hình dung, anh Creyt có hai ví dụ "siêu to khổng lồ" đây:

1. Thực thi một Interface (Hành Động Đơn Lẻ)

Giả sử chúng ta có một interface HanhDong định nghĩa một hành động cần làm.

interface HanhDong {
    void thucHien(String tenTacVu);
}

public class ViDuAnonymousClass {
    public static void main(String[] args) {
        System.out.println("--- Dùng Anonymous Inner Class ---\n");

        // Đây là Anonymous Inner Class đang thực thi interface HanhDong
        // Giống như 'ới' một anh shipper, bảo anh ấy làm đúng một việc
        HanhDong hanhDongMotLan = new HanhDong() {
            @Override
            public void thucHien(String tenTacVu) {
                System.out.println("Anh shipper (Anonymous Class) vừa thực hiện: " + tenTacVu + " một cách nhanh gọn!");
            }
        };

        hanhDongMotLan.thucHien("Giao hàng siêu tốc");

        // Có thể dùng trực tiếp luôn mà không cần gán vào biến
        // Một anh shipper khác, làm việc xong là 'biến mất'
        new HanhDong() {
            @Override
            public void thucHien(String tenTacVu) {
                System.out.println("Một anh shipper khác (Anonymous Class) vừa chạy qua và làm: " + tenTacVu + " không cần giới thiệu!");
            }
        }.thucHien("Thanh toán hóa đơn");
    }
}

2. Kế thừa một Abstract Class (Dịch Vụ Tạm Thời)

Bây giờ, nếu chúng ta có một abstract class DichVu với một vài phương thức cụ thể và một phương thức trừu tượng cần được cài đặt.

abstract class DichVu {
    abstract void cungCap(String tenDichVu);
    void thongBao() {
        System.out.println("Dịch vụ đã sẵn sàng!");
    }
}

public class ViDuAnonymousAbstractClass {
    public static void main(String[] args) {
        System.out.println("\n--- Dùng Anonymous Inner Class với Abstract Class ---\n");

        // Tạo một đối tượng từ abstract class DichVu bằng Anonymous Inner Class
        // Giống như tạo một 'dịch vụ tạm thời' chỉ để dùng một lần
        DichVu dichVuTamThoi = new DichVu() {
            @Override
            void cungCap(String tenDichVu) {
                System.out.println("Dịch vụ 'vô danh' đang cung cấp: " + tenDichVu + ".");
            }
        };

        dichVuTamThoi.thongBao();
        dichVuTamThoi.cungCap("Tư vấn nhanh chóng");
    }
}
Illustration

Mẹo Từ Creyt: Khi Nào Thì "Quất", Khi Nào Thì "Né"?

Anh Creyt có vài "chiêu" để các em nhớ và dùng cho đúng:

  • Khi nào thì "quất"? (Nên dùng)

    • Khi bạn cần một implement/extend class chỉ dùng ĐÚNG MỘT LẦN và không có ý định tái sử dụng ở chỗ khác. Ví dụ điển hình là các event listener trong GUI (như click button), hoặc tạo thread (implement Runnable).
    • Khi logic bên trong class đó RẤT NGẮN GỌN, chỉ vài dòng code thôi. Coi nó như một "lambda expression" bản cổ điển của Java vậy.
    • Để code nhìn "ngầu" hơn, gọn gàng hơn, không phải tạo thêm file *.java lộn xộn cho những class nhỏ.
  • Khi nào thì "né"? (Không nên dùng)

    Gợi Ý Đọc Tiếp
    Inner Class: Chuyên Gia Bí Mật Trong Lập Trình Java

    2 Lượt xem

    • Khi logic phức tạp, dài dòng. Nó sẽ làm code của bạn khó đọc như "mật mã của hacker" vậy. Debug cũng sẽ "khóc thét".
    • Khi bạn cần tái sử dụng logic đó ở nhiều nơi. Lúc này, tạo một class có tên rõ ràng, đàng hoàng vẫn là chân ái.
    • Khi bạn cần constructor với tham số. Anonymous Inner Class không có constructor riêng (nó dùng constructor của superclass mặc định).
  • Lưu ý nhỏ: Anonymous Inner Class có thể truy cập các biến final hoặc effectively final trong phạm vi bao quanh nó. Đây là một điểm quan trọng cần nhớ để tránh những lỗi "ngớ ngẩn".

Ứng Dụng Thực Tế: "Shipper Vô Danh" Ở Đâu?

Anonymous Inner Class xuất hiện ở khắp mọi nơi trong các hệ thống Java "xịn xò", từ desktop đến mobile:

  • Android Development: Cực kỳ phổ biến trong việc xử lý sự kiện (Event Handling). Ví dụ, khi bạn bấm vào một nút (Button), bạn sẽ thường thấy code kiểu:

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Xử lý khi nút được nhấn
            Toast.makeText(MyActivity.this, "Nút đã được nhấn!", Toast.LENGTH_SHORT).show();
        }
    });
    

    Đây chính là một Anonymous Inner Class đó các em!

  • Java Swing/AWT (GUI Desktop): Tương tự Android, nó là "ông tổ" của việc xử lý sự kiện cho các thành phần GUI.

    JButton myButton = new JButton("Click Me!");
    myButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Button clicked!");
        }
    });
    
  • Java Threads: Khi bạn muốn tạo và chạy một luồng (thread) mới cho một tác vụ ngắn hạn:

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Thread vô danh đang chạy!");
        }
    }).start();
    

Thử Nghiệm Và Khuyến Nghị Từ Creyt

Anh Creyt đã từng "nghiện" Anonymous Inner Class một thời gian dài, đặc biệt là khi làm các project Android đầu tiên. Nó giúp code trông rất gọn gàng, "nghệ" hơn hẳn khi viết các event listener. Thay vì phải định nghĩa một class riêng MyClickListener implements View.OnClickListener, rồi tạo đối tượng new MyClickListener(), thì chỉ cần "phang" thẳng new View.OnClickListener() {...} vào là xong. Tiết kiệm được kha khá dòng code và file rác.

Tuy nhiên, anh cũng từng "sấp mặt" khi lạm dụng nó cho những logic phức tạp. Code trở nên khó đọc, khó debug như "mớ bòng bong" vậy. Khi đó, việc maintain (duy trì) hay mở rộng (extend) gần như là bất khả thi. Cảm giác như đang đọc một cuốn sách không có mục lục, không có tên chương vậy.

Khuyến nghị chân thành: "Hãy coi Anonymous Inner Class như một 'công cụ đặc biệt' trong hộp đồ nghề của các em. Dùng nó khi cần làm những việc 'nhanh gọn lẹ', 'đánh nhanh thắng nhanh' và không muốn để lại 'dấu vết' (tên class). Cụ thể là:

  • Xử lý sự kiện (Event Handlers): Nhất là trong GUI.
  • Tạo Thread (Runnable/Callable): Cho các tác vụ chạy nền ngắn.
  • Callbacks: Khi bạn truyền một đoạn code để nó được thực thi sau này bởi một object khác."

Nhưng nhớ nhé, đừng biến nó thành "cây đũa thần" giải quyết mọi thứ. Đối với những logic lớn, phức tạp, cần tái sử dụng, hay cần constructor tùy chỉnh, hãy quay về với các class có tên tuổi rõ ràng. Lúc đó, "tình yêu đích thực" vẫn là class truyền thống thôi!

Thuộc Series: Java – OOP

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!