web-dev-qa-db-ja.com

パラメータリストの「...」はどういう意味ですか? doInBackground(String ... params)

その構文がわかりません。さまざまな単語に加えて「...」をグーグルで検索しようとしても意味がありません。

19
Jim

これは 可変個引数関数 (多くの言語の例を含むwikiページ)と呼ばれます。

コンピュータプログラミングでは、可変個引数関数は不定代名詞の関数です。つまり、可変数の引数を受け入れる関数です。可変個引数関数のサポートは、プログラミング言語によって大きく異なります。可変個引数関数として自然に出くわす数学および論理演算はたくさんあります。たとえば、数値の合計や文字列やその他のシーケンスの連結は、任意の数のオペランドに論理的に適用できる演算です。多くの言語で可変個引数関数として実装されているもう1つの操作は、出力フォーマットです。 C関数printfとCommonLISP関数フォーマットはそのような2つの例です。どちらも、出力のフォーマットを指定する1つの引数と、フォーマットする値を提供する任意の数の引数を取ります。可変個引数関数は、一部の言語で型安全性の問題を明らかにする可能性があります。たとえば、Cのprintfを注意深く使用すると、フォーマット文字列攻撃と呼ばれるクラスのセキュリティホールが発生する可能性があります。可変個引数関数の言語サポートはタイプセーフではないため、攻撃が可能です。これにより、関数はスタックに配置されたよりも多くの引数をスタックからポップしようとすることができます。つまり、スタックが破損し、予期しない動作が発生します。可変個引数関数は、関数とリスト/シーケンス/配列を引数として受け取り、引数をリストの要素として関数を1回呼び出すapply関数を補完するものと見なすことができます。

Javaで使用されていない機能個人的なお気に入りの1つ。これは基本的に、要素から構築された参照配列です。これを使用する最良の方法の1つは、クラスコンストラクター、または最大2、3、4、5の入力要素などの値を常に見つける必要があるメソッドです。

一例として、汎用の binary tree node を作成したとき、コーディングタスクでこれをコンストラクターで使用しました。これにより、ツリーに要素を追加して配布するだけで済みました。

以下は、ルート"Red"と2つのブランチ"Blue""Green"を持つ文字列型のバイナリツリーを作成します。

new MBTN<String>("Red", "Blue", "Green").

代替案がどうなるか考えてみてください:D単純に要素の一般的な配列を作成することさえできないので、これは地獄のように伸びます。それは間違いなく役に立たないわけではありません。

12
Margus

varargs と呼ばれます。この事実は より良いGoogleの結果 をもたらすはずです。

14
BalusC

それらは「可変引数」または可変引数(略して)です。

基本的に、不特定の数の文字列を渡すことができるため、メソッドのシグネチャ

_public void printStuff(String...messages)
_

以下の通話を効果的に処理できます

_printStuff("hi");
printStuff("hi", "bye");
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later");
_

これは一種のオートボクシングと効果的に考えることができます。 printStuff引数は配列と見なすことができるため、printStuff(String...messages)は概念的にはprintStuff(String[] messages)のように処理されます。上記の呼び出しが効果的に次のように機能する場合

_printStuff(new String[] {"hi"});
printStuff(new String[] {"hi", "bye"});
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"});
_

内部でメッセージにアクセスするには、一般的なList処理プリミティブを使用します。何かのようなもの

_...
if (messages != null) {
  for (String message : messages) {
    System.out.println(message);
  }
}
...
_

実際に配列を作成する必要がないということは、自動ボクシングの出現によりJavaに追加された構文糖衣です。

10
Edwin Buck

@BalusCが述べたように、これはvaragsパラメーターです。これは、そのメソッドに可変数の引数を渡すことができることを意味します。

したがって、次のように定義されたメソッドの場合

public void foo(String...strings) {  }

次の呼び出しは合法です。

foo();
foo("one param");
foo("one", "two", "three");
3
Mike Deck

みんなが言ったように...可変引数(または可変引数)を使用すると、これを行うことができます...

//Method we're using for varargs
public void doSomething(String... datas) {
    if (datas == null || datas.length == 0) {
        System.out.println("We got nothing");
    } else {
        for (String data: datas) {
            System.out.println(data);
        }
    }
}

したがって、以下で説明するこれらの呼び出しはすべて有効です。

String d[] = {"1", "2", "3"};
doSomething(d); //An array of String, as long as the type is exactly as the varargs type.

//OR
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me....

//OR 
doSomething("1"); //Exactly 1;

内部的に可変個引数は、「本質的に」宣言された型の参照配列です。

1
Buhake Sindi

これらは可変長パラメーターです。

これが のリンクです

1
Andy

これは、任意の可変数のパラメーターを使用するJavaメソッドです。

0
Manuel Selva

これは「任意の数の引数」を意味し、未知の数のパラメーターをメソッドに渡すことができることを意味します。

見る

http://download.Oracle.com/javase/tutorial/Java/javaOO/arguments.html 「引数の任意の数」セクションを探します

public Polygon polygonFrom(Point... corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
            + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ;
    lengthOfSide1 = Math.sqrt(squareOfSide1);
    // more method body code follows that creates 
    // and returns a polygon connecting the Points
}
0
Mads Lee Jensen