0Pricing
Java Academy · บทเรียน

พารามิเตอร์ Varargs

กำหนดเมธอดที่รับรายการอาร์กิวเมนต์ความยาวไม่แน่นอน และใช้ร่วมกับอาร์เรย์

พารามิเตอร์ Varargs เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

พารามิเตอร์แบบแปรผัน

พารามิเตอร์แบบแปรผัน (รายการอาร์กิวเมนต์ที่มีความยาวแปรผัน) ช่วยให้คุณกำหนดเมธอดที่รับอาร์กิวเมนต์ชนิดเดียวกันได้ไม่จำกัดจำนวน โดยภายในจะจัดการอาร์กิวเมนต์เหล่านั้นเสมือนอาร์เรย์

การประกาศพารามิเตอร์แบบแปรผัน

ใช้ Type... name สำหรับพารามิเตอร์แบบแปรผัน พารามิเตอร์นี้ต้องอยู่ท้ายสุด และในแต่ละเมธอดมีได้เพียงหนึ่งตัว

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

พารามิเตอร์แบบแปรผันภายใน

พารามิเตอร์แบบแปรผันเป็นเพียงไวยากรณ์อำนวยความสะดวก คอมไพเลอร์จะแปลงการเรียกเมธอดให้เป็นการสร้างอาร์เรย์ ณ จุดที่เรียกเมธอด

// 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

พารามิเตอร์ผสมกับพารามิเตอร์แบบแปรผัน

พารามิเตอร์แบบแปรผันต้องอยู่ท้ายสุด คุณสามารถผสมพารามิเตอร์ปกติไว้ก่อนหน้าได้

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

พารามิเตอร์แบบแปรผันกับชนิดทั่วไป

การใช้พารามิเตอร์แบบแปรผันร่วมกับชนิดทั่วไปจะทำให้เกิดคำเตือนเรื่อง การปนเปื้อนบนฮีป ให้ระงับคำเตือนด้วย @SafeVarargs เมื่อพิสูจน์ได้ว่าเมธอดปลอดภัย

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]

พารามิเตอร์แบบแปรผันกับการโอเวอร์โหลด

เมื่อเมธอดแบบแปรผันถูกโอเวอร์โหลดร่วมกับเมธอดที่ตรงกันทุกประการ ระบบจะเลือกเมธอดที่ตรงกันทุกประการก่อน พารามิเตอร์แบบแปรผันจะถูกใช้เป็นทางเลือกสุดท้าย

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 ใช้พารามิเตอร์แบบแปรผัน

System.out.printf ใช้พารามิเตอร์แบบแปรผัน — เมธอดนี้รับสตริงรูปแบบและอาร์กิวเมนต์ชนิดใดก็ได้จำนวนเท่าใดก็ได้

// 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

การสร้างตัวบันทึกเหตุการณ์ด้วยพารามิเตอร์แบบแปรผัน

การสร้างตัวบันทึกเหตุการณ์แบบมีโครงสร้างอย่างง่าย ซึ่งรับคู่คีย์-ค่าด้วยพารามิเตอร์แบบแปรผัน

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

ข้อควรพิจารณาด้านประสิทธิภาพ

การเรียกเมธอดแบบแปรผันแต่ละครั้งจะสร้างอาร์เรย์ใหม่บนฮีป สำหรับเมธอดอรรถประโยชน์ที่ถูกเรียกบ่อย ควรจัดเตรียมโอเวอร์โหลดที่มีจำนวนพารามิเตอร์ตายตัวเพื่อหลีกเลี่ยงการจัดสรรหน่วยความจำ

// 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); }

พารามิเตอร์แบบแปรผันกับ null

การส่ง null ให้เมธอดแบบแปรผันทำให้เกิดความกำกวม — Java อาจตีความว่าเป็นอาร์เรย์ที่มีค่า null ให้ระบุการแปลงชนิดอย่างชัดเจนเพื่อหลีกเลี่ยงคำเตือน

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)

ภาคปฏิบัติ: ตัวช่วยจัดรูปแบบสตริง

ตัวห่อหุ้ม printf ที่ปลอดภัย ซึ่งส่งคืนสตริงที่จัดรูปแบบแล้ว โดยใช้พารามิเตอร์แบบแปรผันให้สอดคล้องกับรูปแบบของ format-args

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' ...]

ตรวจสอบความเข้าใจอย่างรวดเร็ว

พารามิเตอร์แบบแปรผันมีชนิดใดภายในส่วนเนื้อหาเมธอด

สรุป: พารามิเตอร์แบบแปรผัน

ประเด็นสำคัญ:

  • พารามิเตอร์แบบแปรผัน (ชนิด... ชื่อ) รับอาร์กิวเมนต์ตั้งแต่ 0 ตัวขึ้นไป และภายในจัดการเป็นอาร์เรย์
  • ต้องอยู่ท้ายสุด — ในแต่ละเมธอดมีพารามิเตอร์แบบแปรผันได้เพียงหนึ่งตัว
  • ผู้เรียกสามารถส่งค่าแต่ละค่าแยกกันหรือส่งอาร์เรย์ก็ได้
  • ใช้ @SafeVarargs เพื่อระงับคำเตือนการปนเปื้อนบนฮีปสำหรับพารามิเตอร์แบบแปรผันชนิดทั่วไป
  • โอเวอร์โหลดที่ตรงกันทุกประการจะได้รับความสำคัญมากกว่าโอเวอร์โหลดแบบแปรผัน
  • จัดเตรียมโอเวอร์โหลดที่มีจำนวนพารามิเตอร์ตายตัวสำหรับเมธอดที่ถูกเรียกบ่อย เพื่อหลีกเลี่ยงการจัดสรรอาร์เรย์

คำถามที่พบบ่อย

บทเรียน “พารามิเตอร์ Varargs” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พารามิเตอร์ Varargs” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พารามิเตอร์ Varargs”

กำหนดเมธอดที่รับรายการอาร์กิวเมนต์ความยาวไม่แน่นอน และใช้ร่วมกับอาร์เรย์ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “พารามิเตอร์ Varargs” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. กฎการโอเวอร์โหลดเมธอด
  2. พารามิเตอร์ Varargs
  3. ฟิลด์แบบ Static และค่าคงที่
  4. คลาสอรรถประโยชน์และเมธอดโรงงานแบบ Static
← กลับไปที่ Java Academy