Java Academy · Pelajaran

Parameter Varargs

Takrifkan kaedah yang menerima senarai argumen dengan panjang berubah-ubah dan gabungkannya dengan tatasusunan.

Pelajaran 2 daripada 413 langkah

Parameter Varargs ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Parameter Argumen Berubah-ubah

Parameter argumen berubah-ubah (senarai argumen dengan panjang yang berubah-ubah) membolehkan anda mentakrifkan kaedah yang menerima sebarang bilangan argumen daripada jenis yang sama, yang dikendalikan secara dalaman sebagai tatasusunan.

Mengisytiharkan Parameter Variadik

Gunakan Type... name untuk parameter variadik. Parameter ini mesti menjadi parameter terakhir dan setiap kaedah hanya boleh mempunyai satu parameter variadik.

static int sum(int... numbers) {
    int total = 0;
    for (int n : numbers) total += n;
    return total;
}

System.out.println(sum());           // 0 (empty array)
System.out.println(sum(1));          // 1
System.out.println(sum(1, 2, 3));    // 6
System.out.println(sum(1, 2, 3, 4)); // 10

// Can also pass an array
int[] arr = {5, 10, 15};
System.out.println(sum(arr));        // 30

Cara Dalaman Parameter Variadik

Parameter variadik ialah gula sintaksis. Penyusun menukarkan panggilan tersebut kepada penciptaan tatasusunan di lokasi panggilan.

// Calling: sum(1, 2, 3)
// Compiler generates: sum(new int[]{1, 2, 3})

static void printAll(String label, String... items) {
    System.out.println(label + ":");
    for (String item : items) System.out.println("  - " + item);
}

printAll("Fruits", "Apple", "Banana", "Cherry");
// Fruits:
//   - Apple
//   - Banana
//   - Cherry

printAll("Empty"); // varargs is empty array

Parameter Campuran dengan Parameter Variadik

Parameter variadik mesti menjadi parameter terakhir. Anda boleh mencampurkannya dengan parameter biasa yang diletakkan sebelumnya.

static double average(String label, double... values) {
    if (values.length == 0) return 0.0;
    double sum = 0;
    for (double v : values) sum += v;
    double avg = sum / values.length;
    System.out.printf("%s average: %.2f%n", label, avg);
    return avg;
}

average("Math scores", 92.0, 85.5, 78.0, 95.0);
// Math scores average: 87.62

average("Single value", 100.0);
// Single value average: 100.00

Parameter Variadik dengan Jenis Generik

Penggunaan parameter variadik dengan generik menyebabkan amaran pencemaran timbunan. Sembunyikan amaran itu dengan @SafeVarargs apabila keselamatan kaedah tersebut dapat dibuktikan.

import java.util.Arrays;
import java.util.List;

@SafeVarargs  // suppresses heap pollution warning
static <T> List<T> listOf(T... elements) {
    return Arrays.asList(elements); // safe: we don't store to the array
}

List<String> names = listOf("Alice", "Bob", "Charlie");
System.out.println(names); // [Alice, Bob, Charlie]

List<Integer> scores = listOf(95, 87, 73);
System.out.println(scores); // [95, 87, 73]

Parameter Variadik dan Pemuatan Berlebihan

Apabila kaedah variadik terlebih muatan dengan padanan tepat, padanan tepat akan diutamakan. Parameter variadik ialah pilihan terakhir.

static void log(String msg)         { System.out.println("1-arg: " + msg); }
static void log(String m1, String m2) { System.out.println("2-arg: " + m1 + ", " + m2); }
static void log(String... msgs)        { System.out.println("varargs: " + msgs.length); }

log("hello");          // 1-arg: hello
log("a", "b");         // 2-arg: a, b
log("a", "b", "c");   // varargs: 3
log();                  // varargs: 0

printf ialah Variadik

System.out.printf menggunakan parameter variadik — ia menerima rentetan format dan sebarang bilangan argumen daripada apa-apa jenis.

// printf signature: printf(String format, Object... args)
System.out.printf("%s ordered %d items for $%.2f%n",
    "Alice", 3, 59.97);
// Alice ordered 3 items for $59.97

// String.format is also varargs
String msg = String.format("Error %d: %s", 404, "Not Found");
System.out.println(msg); // Error 404: Not Found

Membina Logger dengan Parameter Variadik

Melaksanakan pencatat log berstruktur yang ringkas dan menerima pasangan kunci-nilai menggunakan parameter variadik.

static void logEvent(String event, Object... keyValues) {
    if (keyValues.length % 2 != 0)
        throw new IllegalArgumentException("Key-value pairs required");
    StringBuilder sb = new StringBuilder(event);
    for (int i = 0; i < keyValues.length; i += 2)
        sb.append(" ").append(keyValues[i]).append("=").append(keyValues[i+1]);
    System.out.println(sb);
}

logEvent("user.login",  "userId", 42, "ip", "192.168.1.1", "success", true);
// user.login userId=42 ip=192.168.1.1 success=true

Pertimbangan Prestasi

Setiap panggilan parameter variadik mencipta tatasusunan baharu pada timbunan. Untuk kaedah utiliti yang dipanggil dengan kerap, sediakan kaedah terlebih muatan dengan bilangan parameter tetap bagi mengelakkan peruntukan.

// Java's own EnumSet does this:
static <E extends Enum<E>> EnumSet<E> of(E e)              { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)       { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E... rest)  { ... }
// Avoids array creation for 1-3 args (most common case)

// Apply the same pattern to your own hot-path APIs:
static void report(String msg)             { log(new String[]{msg}); }
static void report(String m1, String m2)   { log(new String[]{m1, m2}); }
static void report(String... msgs)         { log(msgs); }

Parameter Variadik dan null

Menghantar null kepada kaedah variadik adalah kabur — Java mungkin mentafsirkannya sebagai tatasusunan null. Gunakan cast yang jelas untuk mengelakkan amaran.

static void printItems(String... items) {
    if (items == null) {
        System.out.println("null array passed");
        return;
    }
    for (String item : items)
        System.out.println(item != null ? item : "(null element)");
}

printItems((String[]) null); // null array passed
printItems(null, "valid");   // (null element), valid
printItems();                 // empty array (0 items)

Praktikal: Pembantu Format String

Pembalut printf yang selamat dan mengembalikan rentetan yang telah diformatkan, menggunakan parameter variadik untuk memadankan gaya argumen format.

static String fmt(String pattern, Object... args) {
    try {
        return String.format(pattern, args);
    } catch (java.util.IllegalFormatException e) {
        return "[FORMAT ERROR: " + e.getMessage() + "]";
    }
}

System.out.println(fmt("User %s has %d orders", "Alice", 5));
// User Alice has 5 orders

System.out.println(fmt("Invalid %z format", "arg"));
// [FORMAT ERROR: Conversion = 'z' ...]

Semakan Pantas

Apakah jenis parameter variadik di dalam badan kaedah?

Ringkasan: Parameter Variadik

Perkara utama:

  • Parameter variadik (Type... name) menerima 0 atau lebih argumen dan secara dalaman mengendalikannya sebagai tatasusunan
  • Mesti menjadi parameter terakhir — setiap kaedah hanya boleh mempunyai satu parameter variadik
  • Pemanggil boleh menghantar nilai individu atau tatasusunan
  • Gunakan @SafeVarargs untuk menyembunyikan amaran pencemaran timbunan bagi parameter variadik generik
  • Kaedah terlebih muatan dengan padanan tepat diutamakan berbanding kaedah variadik
  • Sediakan kaedah dengan bilangan parameter tetap untuk kaedah yang kerap dipanggil bagi mengelakkan peruntukan tatasusunan
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Parameter Varargs” percuma?

Ya — teks penuh “Parameter Varargs” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Parameter Varargs”?

Takrifkan kaedah yang menerima senarai argumen dengan panjang berubah-ubah dan gabungkannya dengan tatasusunan. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Parameter Varargs” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Peraturan Lebihan Muatan Kaedah
  2. Parameter Varargs
  3. Medan Statik dan Pemalar
  4. Kelas Utiliti dan Kaedah Kilang Statik
← Kembali ke Java Academy