Java -INNER CLASS DIAMOND OPERATOR

Xin chào, các bạn lập trình Java! Hôm nay, chúng ta sẽ cùng tìm hiểu một chủ đề thú vị có thể听起来有点令人害怕 ban đầu, nhưng tôi đảm bảo rằng bạn sẽ thấy nó rất hấp dẫn khi chúng ta phân tích nó. Chúng ta đang nói về Java Inner Class Diamond Operator. Đừng lo lắng nếu những từ này听起来 như là một thứ tiếng lóng right now - đến cuối bài học này, bạn sẽ sử dụng công cụ mạnh mẽ này như một chuyên gia!

Java - Inner Class Diamond Operator

INNER CLASS LÀ GÌ?

Trước khi chúng ta nhảy vào diamond operator, hãy bắt đầu với những điều cơ bản. Một inner class đơn giản là một class được định nghĩa bên trong một class khác. Nó giống như có một hộp nhỏ hơn bên trong một hộp lớn hơn. Inner class có thể truy cập tất cả các thành viên của outer class, thậm chí là các thành viên private. Đ酷, phải không?

Dưới đây là một ví dụ đơn giản:

public class OuterClass {
private int outerField = 10;

class InnerClass {
void printOuterField() {
System.out.println("Giá trị outer field: " + outerField);
}
}
}

Trong ví dụ này, InnerClass được nhúng bên trong OuterClass và có thể truy cập outerField trực tiếp.

DIAMOND OPERATOR LÀ GÌ?

Bây giờ, hãy nói về ngôi sao của chúng ta - Diamond Operator (<>). Cậu bé này được giới thiệu trong Java 7 để làm cho cuộc sống của chúng ta dễ dàng hơn khi làm việc với các type generic. Nó được gọi là "diamond" operator vì... à, nó trông giống như một viên kim cương! ?

Diamond operator cho phép chúng ta bỏ qua các đối số type khi编译器 có thể suy ra chúng tự động. Nó giống như có một người bạn thông minh luôn hoàn thành câu của bạn chính xác!

Hãy cùng xem nó trong hành động:

// Trước Java 7
List<String> myList = new ArrayList<String>();

// Với Diamond Operator (Java 7 và sau)
List<String> myList = new ArrayList<>();

Thấy cách chúng ta không cần phải lặp lại <String> ở dòng thứ hai phải không? Đó là phép màu của diamond operator!

DIAMOND OPERATOR VỚI INNER CLASSES

Bây giờ, hãy kết hợp những gì chúng ta đã học về inner classes và diamond operator. Đây là nơi mà mọi thứ trở nên thực sự thú vị!

public class OuterClass {
class InnerClass<T> {
T value;
InnerClass(T value) {
this.value = value;
}
}

public void createInner() {
// Trước Java 9
InnerClass<String> inner1 = this.new InnerClass<String>("Hello");

// Java 9 và sau
InnerClass<String> inner2 = this.new InnerClass<>("Hello");
}
}

Trong ví dụ này, chúng ta có một inner class generic. Trước Java 9, chúng ta phải chỉ định đối số type hai lần khi tạo một thể hiện của inner class. Nhưng từ Java 9 trở đi, chúng ta có thể sử dụng diamond operator để làm cho mã của chúng ta sạch sẽ và ngắn gọn hơn.

DIAMOND OPERATOR TRONG ANONYMOUS CLASSES

Diamond operator trở nên mạnh mẽ hơn khi sử dụng với các anonymous classes. Một anonymous class giống như một inner class một lần sử dụng mà chúng ta định nghĩa và khởi tạo cùng một lúc. Nó hoàn hảo cho khi bạn cần một thực hiện nhanh chóng, tạm thời của một interface hoặc class trừu tượng.

Hãy xem một ví dụ:

interface Greeting {
void greet();
}

public class DiamondOperatorDemo {
public static void main(String[] args) {
// Trước Java 9
Greeting greeting1 = new Greeting<String>() {
@Override
public void greet() {
System.out.println("Hello, World!");
}
};

// Java 9 và sau
Greeting greeting2 = new Greeting<>() {
@Override
public void greet() {
System.out.println("Hello, World!");
}
};

greeting1.greet();
greeting2.greet();
}
}

Trong ví dụ này, chúng ta đang tạo các anonymous classes implement interface Greeting. Với Java 9 và sau, chúng ta có thể sử dụng diamond operator để làm cho mã của chúng ta sạch sẽ hơn.

SỰ PHÁT TRIỂN CỦA DIAMOND OPERATOR

Diamond operator đã phát triển qua các phiên bản Java khác nhau. Hãy cùng đi qua một tour nhanh:

Java 7

Java 7 giới thiệu diamond operator, nhưng nó chỉ có thể được sử dụng với các class cụ thể.

List<String> list = new ArrayList<>();  // Điều này hoạt động
Map<String, List<String>> map = new HashMap<>();  // Điều này cũng hoạt động

Java 8

Java 8 không mang lại bất kỳ thay đổi lớn nào cho diamond operator.

Java 9 và Sau

Java 9 mở rộng việc sử dụng diamond operator đến các anonymous classes, như chúng ta đã thấy trong các ví dụ trước. Điều này làm cho mã của chúng ta trở nên ngắn gọn và dễ đọc hơn.

// Điều này hoạt động trong Java 9+
Comparator<String> comparator = new Comparator<>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
};

ỨNG DỤNG THỰC TẾ

Bây giờ chúng ta đã hiểu diamond operator, hãy xem một số ứng dụng thực tế. Hãy tưởng tượng bạn đang xây dựng một hệ thống kho lưu trữ game:

public class GameInventory {
class Item<T> {
private String name;
private T value;

Item(String name, T value) {
this.name = name;
this.value = value;
}

// getters and setters...
}

public void addItem() {
// Trước Java 9
Item<Integer> sword = this.new Item<Integer>("Sword", 100);

// Java 9 và sau
Item<Integer> shield = this.new Item<>("Shield", 50);

System.out.println("Đã thêm: " + sword.name + " với giá trị " + sword.value);
System.out.println("Đã thêm: " + shield.name + " với giá trị " + shield.value);
}
}

Trong ví dụ này, chúng ta sử dụng diamond operator để tạo các thể hiện của inner Item class. Điều này làm cho mã của chúng ta sạch sẽ và dễ đọc hơn, đặc biệt là khi làm việc với các type generic phức tạp hơn.

KẾT LUẬN

Và đây bạn có nó, các bạn! Chúng ta đã cùng nhau khám phá thế giới của inner classes và diamond operator. Từ những bước đầu tiên trong Java 7 đến những khả năng mở rộng trong Java 9 và sau, diamond operator đã trở thành một công cụ không thể thiếu trong bộ công cụ của một lập trình viên Java.

Nhớ rằng, mục tiêu của các tính năng như diamond operator là làm cho mã của chúng ta dễ đọc và duy trì hơn. Nó không phải để gõ ít hơn (dù đó là một lợi ích tốt!), mà là để biểu đạt ý định của chúng ta rõ ràng hơn.

Trong khi bạn tiếp tục hành trình Java của mình, hãy để ý đến cơ hội sử dụng diamond operator. Đó là những cải tiến nhỏ này, qua thời gian, sẽ làm bạn trở thành một lập trình viên hiệu quả và hiệu suất cao hơn.

Chúc các bạn lập trình vui vẻ, và hy vọng những viên kim cương của bạn luôn lấp lánh! ?✨

Credits: Image by storyset