Java - 內部類別菱形運算符

你好,有志於Java程式設計的各位!今天,我們將深入探討一個可能一開始會讓人覺得有些嚇人的話題,但我保證一旦我們將其拆解,你會覺得它非常迷人。我們要討論的是Java的內部類別菱形運算符。現在這些話聽起來可能像是一堆亂碼,但到了這堂課結束時,你將能像專家一樣熟練地使用這個強大的工具!

Java - Inner Class Diamond Operator

內部類別是什麼?

在我們深入菱形運算符之前,讓我們從基礎開始。內部類別就是在一個類別內定義的類別。這就像在一個大盒子裡有一個小盒子。內部類別可以訪問外部類別的所有成員,甚至是私有的成員。酷吧?

這裡有一個簡單的例子:

public class OuterClass {
private int outerField = 10;

class InnerClass {
void printOuterField() {
System.out.println("外部類別字段值: " + outerField);
}
}
}

在這個例子中,InnerClass 嵌套在 OuterClass 內部,並可以直接訪問 outerField

菱形運算符是什麼?

現在,讓我們來討論我們節目的明星——菱形運算符 (<>)。這個小夥伴在Java 7中被引入,讓我們在處理泛型類型時生活更加輕鬆。它被稱為“菱形”運算符,因為……嗯,它看起來就像一個菱形!?

菱形運算符讓我們在編譯器可以自動推斷類型時省略類型參數。這就像有一個能夠每次都正確地完成你句子的聰明朋友!

讓我們看看它是如何工作的:

// Java 7之前
List<String> myList = new ArrayList<String>();

// 使用菱形運算符(Java 7及之後)
List<String> myList = new ArrayList<>();

看到我們在第二行沒有需要重複<String>了嗎?這就是菱形運算符的魔力!

內部類別中的菱形運算符

現在,讓我們把我們學到的關於內部類別和菱形運算符的知識結合起來。這裡的事情會變得非常有趣!

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

public void createInner() {
// Java 9之前
InnerClass<String> inner1 = this.new InnerClass<String>("Hello");

// Java 9及之後
InnerClass<String> inner2 = this.new InnerClass<>("Hello");
}
}

在這個例子中,我們有一個泛型內部類別。在Java 9之前,我們在創建內部類別的實例時必須指定類型參數兩次。但從Java 9開始,我們可以使用菱形運算符來讓我們的代碼更乾淨、更簡潔。

匿名類別中的菱形運算符

當與匿名類別一起使用時,菱形運算符變得更加強大。匿名類別就像是一次性使用的內部類別,我們在同時定義和實例化它。這對於當你需要一個快速、一次性的接口或抽象類別實現時非常完美。

讓我們看一個例子:

interface Greeting {
void greet();
}

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

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

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

在這個例子中,我們正在創建實現Greeting接口的匿名類別。從Java 9和之後,我們可以使用菱形運算符來讓我們的代碼更乾淨。

菱形運算符的演變

菱形運算符在不同的Java版本中有所演變。讓我們快速看一下:

Java 7

Java 7引入了菱形運算符,但它只能與具體類一起使用。

List<String> list = new ArrayList<>();  // 這個可以工作
Map<String, List<String>> map = new HashMap<>();  // 這個也可以工作

Java 8

Java 8對菱形運算符沒有帶來任何重大變化。

Java 9及之後

Java 9將菱形運算符的使用擴展到匿名類別,正如我們在前面的例子中所看到的。這使得代碼更加簡潔和易於閱讀。

// 這個在Java 9+中可以工作
Comparator<String> comparator = new Comparator<>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
};

實際應用

現在我們了解了菱形運算符,讓我們看看一些實際應用。想像一下你正在建立一個遊戲庫存系統:

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

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

// getter和setter...
}

public void addItem() {
// Java 9之前
Item<Integer> sword = this.new Item<Integer>("Sword", 100);

// Java 9及之後
Item<Integer> shield = this.new Item<>("Shield", 50);

System.out.println("已添加: " + sword.name + " 价值 " + sword.value);
System.out.println("已添加: " + shield.name + " 价值 " + shield.value);
}
}

在這個例子中,我們使用菱形運算符來創建我們內部Item類的實例。這使得我們的代碼更乾淨、更易於閱讀,尤其是在處理更複雜的泛型類型時。

結論

好了,各位!我們已經穿越了內部類別和菱形運算符的世界。從它在Java 7中的謙卑開始,到它在Java 9及之後的擴展能力,菱形運算符已經成為Java程式設計師工具箱中不可或缺的工具。

記住,像菱形運算符這樣的功能的目標是讓我們的代碼更加易於閱讀和维护。這不是關於打得更快(雖然這是一個不錯的獎勵!),而是關於更清晰地表達我們的意圖。

在你繼續你的Java旅程時,請留心使用菱形運算符的機會。這些小的改進,隨著時間的推移,會讓你成為一個更有效率和更有影響力的程式設計師。

快樂編程,願你的菱形永遠閃耀!?✨

Credits: Image by storyset