99热这里有精品-夜夜嗨av色一区二区不卡-亚洲国产精彩中文乱码AV-日本japanese乳偷乱熟

Java中的可變參數(Varargs)

1. 簡介
可變參數(Varargs)在Java 5中被引入,它為支持一種類型的任意數量參數的方法提供了一種簡便寫法。在本文中,我們將了解如何使用這個Java核心特性。

2. 在可變參數(Varargs)之前
在Java 5之前,每當我們想要傳遞任意數量的參數時,我們必須將所有參數放在一個數組中傳遞,或者實現N個方法(每增加一個參數就實現一個方法):

public String format() {... }
    public String format(String value) {... }
    public String format(String val1, String val2) {... }

3. 可變參數(Varargs)的使用
可變參數(Varargs)通過引入能夠自動處理任意數量參數的新語法(在底層使用數組),幫助我們避免編寫樣板代碼。我們可以使用標準類型聲明,后跟省略號(...)來定義它們:

public String formatWithVarArgs(String... values) {
        //...
    }

現在,我們可以使用任意數量的參數來調用我們的方法,例如:

formatWithVarArgs();
    formatWithVarArgs("a", "b", "c", "d");

如前所述,可變參數(Varargs)就是數組,所以我們需要像處理普通數組一樣處理它們。

4. 規則
可變參數(Varargs)使用起來很簡單,但我們需要記住一些規則:

  • 每個方法只能有一個可變參數(Varargs)參數
  • 可變參數(Varargs)參數必須是最后一個參數

5. 堆污染
使用可變參數(Varargs)可能會導致所謂的堆污染。為了更好地理解堆污染,請考慮這個可變參數(Varargs)方法:

static String firstOfFirst(List<String>... strings) {
        List<Integer> ints = Collections.singletonList(42);
        Object[] objects = strings;
        objects[0] = ints; // 堆污染
        return strings[0].get(0); // 類轉換異常
    }

如果我們在測試中調用這個奇怪的方法:

String one = firstOfFirst(Arrays.asList("one", "two"), Collections.emptyList());
    assertEquals("one", one);

我們將會得到一個類轉換異常:

java.lang.ClassCastException: class java.lang.Integer不能轉換為class java.lang.String

5.1. 安全使用
每次我們使用可變參數(Varargs)時,Java編譯器都會創建一個數組來保存給定的參數。在這種情況下,編譯器會創建一個具有泛型類型組件的數組來保存參數。當我們將可變參數與泛型類型一起使用時,由于存在潛在的運行時異常,Java編譯器會警告可能存在不安全的可變參數使用:

警告: [varargs] 來自參數化可變參數類型T的可能的堆污染

5.2. 可變參數引用的逃逸
讓我們考慮可變參數的另一種不安全用法:

static <T> T[] toArray(T... arguments) {
        return arguments;
    }

6. 結論
在Java中,可變參數(Varargs)可以消除大量樣板代碼,簡化代碼結構。

若你想提升Java技能,可關注我們的Java培訓課程。

福建省| 龙口市| 修武县| 灵川县| 鄄城县| 辉县市| 瑞昌市| 繁峙县| 涞水县| 桃源县| 浑源县| 石渠县| 巴里| 睢宁县| 古浪县| 进贤县| 新和县| 故城县| 黄山市| 兴宁市| 榕江县| 二手房| 满城县| 康乐县| 隆德县| 德格县| 尉氏县| 柏乡县| 深水埗区| 盐津县| 东明县| 佳木斯市| 洪泽县| 通渭县| 三明市| 巫山县| 伊春市| 琼海市| 霍林郭勒市| 同心县| 灵璧县|