Chuỗi [] args vs (Chuỗi .. Args)


9

Khi lập trình cho Android, bất cứ khi nào tôi sử dụng AsyncTask, phương thức doInBackground trông như thế này.

 protected String doInBackground(String... args)

Nhưng khi sử dụng các đối số ở bất cứ đâu trong khối đó, tôi có thể truy cập chúng như một mảng Chuỗi bình thường, ví dụ như trong chương trình của tôi

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

Mà hoạt động tốt và tôi không có vấn đề đối phó với nó. Nhưng tôi tự hỏi tại sao họ sử dụng (Chuỗi .. Args) thay vì một chuỗi bình thường. Có phải chỉ vì trong phương thức gọi, bạn có thể viết một cái gì đó như:

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

thay vì tạo một mảng mới để vượt qua các đối số? Mặc dù chúng tôi có thể viết

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

đó là một chút dài dòng hơn.

Có phải (Chuỗi ...) và Chuỗi [] đồng nghĩa với cách chúng hoạt động, nhưng việc truyền đối số chỉ dễ dàng hơn khi sử dụng trước vì không cần phải tạo một mảng? Theo như tôi có thể nói, trước đây cũng được dịch sang một chuỗi chuỗi trong nền để cả hai cùng biên dịch thành cùng một mã và đó chỉ là 'đường cú pháp'?


(String ...)có nghĩa là bạn có thể thêm nhiều Stringparam như bạn muốn, String[]là một tham số là một chuỗi các chuỗi. (String ...)phụ thuộc vào thông số đầu tiên AsyncTask, không phải lúc nào cũng vậy String.
FaizanRabbani

@FaizanRabbani ngoại trừ việc bạn cũng có thể gọi một String...như thể đó làString[]
ratchet quái

@ratchetfreak Có, nó có thể hoạt động như một String[], nhưng giả sử nó là mặc định String[]. Việc sử dụng các thông số khác nhau Stringtrong một mảng sẽ là một vấn đề . Thay vào đó họ đã cho một sự linh hoạt để sử dụng (String ...).
FaizanRabbani

@FaizanRabbani Tôi biết rằng nó không phải lúc nào cũng là Chuỗi, nó chỉ là một ví dụ =). Tương tự với Boolean ... hoặc những thứ khác, nhưng tôi thích sử dụng Chuỗi do chính (Chuỗi [] args) mà chúng ta quen thuộc. Và bạn đã nói 'bạn có thể truyền nhiều chuỗi như bạn muốn', bạn cũng có thể truyền khá nhiều chuỗi với một mảng. Đối với tôi có vẻ như bạn vẫn có thể đạt được điều tương tự với các mảng, mặc dù nó ít đọc và rắc rối hơn. (Truyền một mảng các ví dụ, sẽ làm giảm khả năng đọc một chút). Có đúng là nó chủ yếu để dễ đọc không? (cảm ơn đã btw)
Dylan Meeus

@FaizanRabbani cũng là một gói đơn giản new String[]{...}để chuyển đổi (đó là những gì thực sự xảy ra khi bạn sử dụng a String...)
ratchet freak

Câu trả lời:


15

(String ...)một mảng các tham số loại String, trong đó như String[]một tham số duy nhất .

Bây giờ ở đây String[]có thể điền đầy đủ cùng một mục đích ở đây nhưng (String ...)cung cấp dễ đọc và dễ sử dụng hơn.

Nó cũng cung cấp một tùy chọn mà chúng ta có thể vượt qua nhiều mảng Stringthay vì một mảng duy nhất bằng cách sử dụng String[].


1
Trong khi String[]có thể được truyền vào một phương thức lấy String...tham số, hai String[]s không thể. Không có sự kết hợp mảng ngầm diễn ra ở đây.

5

Một tính năng của Chuỗi [] so với Chuỗi ... là "Chuỗi ..." không cần phải là một phần của cuộc gọi.

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

Sau đó, nếu bạn gọi callerTest();Đầu ra sẽ là:

No args defined.

tree

dog
cat
pigeon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.