String [] args vs (String.... args)


9

เมื่อเขียนโปรแกรมสำหรับ android ทุกครั้งที่ฉันใช้ AsyncTask วิธี doInBackground จะมีลักษณะดังนี้

 protected String doInBackground(String... args)

แต่เมื่อใช้อาร์กิวเมนต์ที่ใดก็ได้ในบล็อกนั้นฉันสามารถเข้าถึงพวกเขาเหมือนอาร์เรย์สตริงปกติเช่นในโปรแกรมของฉัน

        @Override
    protected String doInBackground(String... args)
    {
        String details = "";
        try
        {
            details = facade.getRecipeDetails(args[0]);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return details;
    }

ซึ่งใช้งานได้ดีและฉันไม่มีปัญหาในการจัดการกับมัน แต่ฉันสงสัยว่าทำไมพวกเขาจึงใช้ (String.... args) แทนที่จะเป็นสตริงปกติ เป็นเพราะในวิธีการโทรคุณก็สามารถเขียนสิ่งที่ชอบ:

 new AsyncHandler.execute("argument1","argument2","argument3",...)  

แทนที่จะสร้างอาร์เรย์ใหม่เพื่อส่งต่ออาร์กิวเมนต์? แม้ว่าเราจะเขียนได้

new AsyncHandler().execute(new String[]{"Argument1","Argument2"});

ซึ่งเป็น verbose อีกเล็กน้อย

(String ... ) และ String [] มีความหมายเหมือนกันในวิธีการทำงาน แต่การส่งผ่านอาร์กิวเมนต์นั้นทำได้ง่ายกว่าการใช้อดีตเนื่องจากไม่จำเป็นต้องสร้างอาร์เรย์? เท่าที่ฉันสามารถบอกได้อดีตยังได้รับการแปลเป็นอาเรย์สตริงในพื้นหลังดังนั้นพวกเขาทั้งสองจะรวบรวมรหัสเดียวกันและเป็นเพียง 'น้ำตาลน้ำตาล'?


(String ...)หมายความว่าคุณสามารถเพิ่มStringพารามิเตอร์ได้มากเท่าที่คุณต้องการString[]เป็นหนึ่งพารามิเตอร์ซึ่งเป็นอาร์เรย์ของสตริง (String ...)ขึ้นอยู่กับพารามิเตอร์แรกของAsyncTaskมันไม่เสมอStringไป
FaizanRabbani

@FaizanRabbani ยกเว้นว่าคุณสามารถโทรได้String...ราวกับว่ามันString[]
ratchet freak

@ratchetfreak ใช่มันสามารถทำหน้าที่เป็นแต่ให้ถือว่ามันเป็นไปโดยปริยายString[] String[]คงเป็นปัญหาที่จะใช้Stringพารามิเตอร์ที่แตกต่างกันในอาเรย์ (String ...)แต่พวกเขาให้ความยืดหยุ่นในการใช้งาน
FaizanRabbani

@FaizanRabbani ฉันรู้ว่ามันไม่ได้เป็น String เสมอมันเป็นเพียงตัวอย่าง =) กันไปสำหรับบูลีน ... หรือสิ่งอื่น ๆ แต่ฉันชอบที่จะใช้ String เนื่องจากหลัก (String [] args) ที่เราคุ้นเคย และคุณพูดว่า 'คุณสามารถส่งผ่านสตริงได้มากเท่าที่คุณต้องการ' และคุณสามารถส่งผ่านสตริงได้ไม่กี่ตัวด้วยอาเรย์ สำหรับฉันมันยังคงดูเหมือนว่าคุณสามารถทำสิ่งเดียวกันกับอาร์เรย์ได้แม้ว่าจะอ่านน้อยลงและยุ่งยากมากขึ้น (เช่นการผ่านอาร์เรย์ของอาร์เรย์จะช่วยลดความสามารถในการอ่านได้เล็กน้อย) ถูกต้องหรือไม่ว่าเป็นส่วนใหญ่เพื่อให้อ่านได้หรือไม่ (ขอบคุณ btw แล้ว)
Dylan Meeus

@FizanRabbani ดีมันเป็นเรื่องง่ายในnew String[]{...}การแปลง (เป็นสิ่งที่เกิดขึ้นจริงเมื่อคุณใช้String...)
ratchet freak

คำตอบ:


15

(String ...)เป็นอาร์เรย์ของพารามิเตอร์ชนิดStringที่เป็นString[]เป็นพารามิเตอร์เดียว

ตอนนี้ที่นี่String[]สามารถเติมเต็มวัตถุประสงค์เดียวกันที่นี่ แต่(String ...)ให้อ่านง่ายขึ้นและง่ายต่อการใช้

นอกจากนี้ยังมีตัวเลือกที่เราสามารถส่งผ่านอาร์เรย์หลายของมากกว่าหนึ่งเดียวโดยใช้StringString[]


1
ในขณะที่String[]สามารถส่งผ่านไปยังวิธีการString...เป็นพารามิเตอร์สองString[]s ไม่สามารถ ไม่มีการต่อข้อมูลอาเรย์โดยนัยที่เกิดขึ้นที่นี่

5

คุณสมบัติของ String [] vs String ... คือ "String ... " ไม่จำเป็นต้องเป็นส่วนหนึ่งของการโทร

public void test(String... args){ 
   if(args.length > 0){
      for( String text : args){
         System.out.println(text);
      }
   }else{
      System.out.println("No args defined.");
   }
}

public void callerTest(){
     test();
     System.out.println();

     test("tree");
     System.out.println();

     test("dog", "cat", "pigeon");
}

จากนั้นถ้าคุณเรียกcallerTest();ใช้เอาต์พุตจะเป็น:

No args defined.

tree

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