String [] args vs (String.. Args)


9

Saat pemrograman untuk android, setiap kali saya menggunakan AsyncTask, metode doInBackground terlihat seperti ini.

 protected String doInBackground(String... args)

Tetapi ketika menggunakan argumen di mana saja di blok itu saya dapat mengaksesnya seperti array String normal misalnya di program saya

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

Yang berfungsi dengan baik dan saya tidak punya masalah menanganinya. Tapi saya bertanya-tanya mengapa mereka menggunakan (String ... args) bukan array normal dari String. Apakah hanya karena dalam metode pemanggilan Anda hanya dapat menulis sesuatu seperti:

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

alih-alih membuat array baru untuk meneruskan argumen? Padahal kita bisa menulis

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

yang sedikit lebih verbose.

Apakah (String ...) dan String [] identik dalam cara kerjanya, tetapi argumen yang lewat lebih mudah menggunakan yang pertama karena tidak perlu membuat array? Sejauh yang saya tahu, yang pertama juga akan diterjemahkan ke array string di latar belakang sehingga mereka berdua mengkompilasi ke kode yang sama dan itu hanya 'gula sintaksis'?


(String ...)berarti Anda dapat menambahkan Stringparam sebanyak yang Anda inginkan, String[]adalah salah satu parameter yang merupakan array dari string. (String ...)tergantung pada param pertama AsyncTask, itu tidak selalu String.
FaizanRabbani

@FaizanRabbani kecuali Anda juga dapat memanggil String...seolah-olahString[]
ratchet freak

@ scratchetfreak Ya itu bisa bertindak sebagai String[], tetapi mari kita asumsikan itu secara default String[]. Ini akan menjadi masalah untuk menggunakan Stringparam yang berbeda dalam array. Sebaliknya mereka memberikan fleksibilitas untuk digunakan (String ...).
FaizanRabbani

@ FaizanRabbani Saya sadar bahwa itu tidak selalu String, itu hanya contoh =). Hal yang sama berlaku untuk Boolean ... atau hal-hal lain, tetapi saya suka menggunakan String karena argumen utama (String []) yang kita kenal. Dan Anda berkata, "Anda dapat mengirimkan string sebanyak yang Anda inginkan", dan Anda bisa mengirimkan beberapa string dengan sebuah array. Bagi saya sepertinya masih bisa mencapai hal yang sama dengan array, meskipun kurang mudah dibaca dan lebih merepotkan. (Melewati array array misalnya, akan mengurangi keterbacaan sedikit). Benarkah itu terutama untuk keterbacaan? (terima kasih sudah btw)
Dylan Meeus

@FaizanRabbani yah, itu adalah bungkus sederhana new String[]{...}untuk mengkonversi (itu yang sebenarnya terjadi ketika Anda menggunakan String...)
ratchet freak

Jawaban:


15

(String ...)adalah array dari parameter tipe String, dimana as String[]adalah parameter tunggal .

Sekarang di sini String[]dapat mengisi penuh tujuan yang sama di sini tetapi (String ...)memberikan lebih banyak keterbacaan dan kemudahan untuk digunakan.

Ini juga menyediakan opsi bahwa kita dapat melewati beberapa array Stringdaripada menggunakan satu String[].


1
Meskipun String[]dapat diteruskan ke metode yang menggunakan String...parameter, dua String[]s tidak bisa. Tidak ada rangkaian array implisit yang terjadi di sini.

5

Fitur dari String [] vs String ... adalah "String ..." tidak perlu menjadi bagian dari panggilan.

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

Maka jika Anda memanggil callerTest();Output akan:

No args defined.

tree

dog
cat
pigeon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.