Java“ params” ใน method signature?


112

ใน C # หากคุณต้องการให้เมธอดมีจำนวนพารามิเตอร์ที่ไม่แน่นอนคุณสามารถสร้างพารามิเตอร์สุดท้ายในเมธอดซิกเนเจอร์ a paramsเพื่อให้เมธอดพารามิเตอร์ดูเหมือนอาร์เรย์ แต่อนุญาตให้ทุกคนที่ใช้เมธอดส่งผ่านพารามิเตอร์ประเภทนั้นให้ได้มากที่สุด ตามที่ผู้โทรต้องการ

ฉันค่อนข้างแน่ใจว่า Java รองรับพฤติกรรมที่คล้ายกัน แต่ฉันหาวิธีทำไม่ได้

คำตอบ:


194

ใน Java เรียกว่าvarargsและไวยากรณ์ดูเหมือนพารามิเตอร์ทั่วไป แต่มีจุดไข่ปลา ("... ") หลังประเภท:

public void foo(Object... bar) {
    for (Object baz : bar) {
        System.out.println(baz.toString());
    }
}

พารามิเตอร์ vararg ต้องเสมอเป็นคนสุดท้ายพารามิเตอร์ในลายเซ็นของวิธีการและมีการเข้าถึงเช่นถ้าคุณได้รับอาร์เรย์ของประเภทนั้น (เช่นObject[]ในกรณีนี้)


3
ขอบคุณที่ฉันค้นพบสิ่งนี้ด้วยตัวเองในขณะที่ฉันกำลังมองหาอย่างอื่นและมาที่นี่เพื่อตอบคำถามด้วยตัวเอง
Omar Kooheji

11

สิ่งนี้จะทำเคล็ดลับใน Java

public void foo(String parameter, Object... arguments);

คุณต้องเพิ่มจุดสามจุด...และvaragrพารามิเตอร์ต้องเป็นตัวสุดท้ายในลายเซ็นของเมธอด


3

ตามที่เขียนไว้ในคำตอบก่อนหน้านี้varargsและประกาศด้วยellipsis( ... )

นอกจากนี้คุณสามารถส่งผ่านประเภทค่าและ / หรือประเภทการอ้างอิงหรือทั้งสองแบบผสมกัน (Google Autoboxing ) นอกจากนี้คุณสามารถใช้พารามิเตอร์ method เป็นอาร์เรย์ดังที่แสดงด้วยprintArgsAlternateวิธีการด้านล่าง

รหัสสาธิต

public class VarargsDemo {

    public static void main(String[] args) {
        printArgs(3, true, "Hello!", new Boolean(true), new Double(25.3), 'a', new Character('X'));
        printArgsAlternate(3, true, "Hello!", new Boolean(true), new Double(25.3), 'a', new Character('X'));
    }

    private static void printArgs(Object... arguments) {
        System.out.print("Arguments: ");
        for(Object o : arguments)
            System.out.print(o + " ");

        System.out.println();
    }

    private static void printArgsAlternate(Object... arguments) {
        System.out.print("Arguments: ");

        for(int i = 0; i < arguments.length; i++)
            System.out.print(arguments[i] + " ");

        System.out.println();
    }

}

เอาท์พุต

Arguments: 3 true Hello! true 25.3 a X 
Arguments: 3 true Hello! true 25.3 a X 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.