Java変数パラメーターリスト
コードコピーは次のとおりです。
クラスA {}
すべてのクラスはオブジェクトから継承されるため、オブジェクト配列をパラメーターとして使用できます。
public class parameter {static void printarray(object [] args){for(object obj:args){system.out.print(obj + ""); } system.out.println(); } public static void main(string [] args){printArray(new object [] {new Integer(47)、new float(3.14)、new double(11.11)}); printArray(new object [] {"One"、 "2"、 ""}); printArray(new object [] {new a()、new a()、new a()}); }}機能を追加した後のJava SE5バージョンの場合、これを書くことができます。
public class parameter {public static void printarray(object ... args){for(object obj:args){system.out.print(obj + ""); } system.out.println(); } public static void main(string [] args){printArray(new Integer(47)、new float(3.14)、new double(11.11)); PrintArray(47、3.14F、11.11); printArray( "One"、 "2"、 "3"); printArray(new a()、new a()、new a()); printArray((object [])new Integer [] {1、2、3、4}); printArray(); }}オブジェクトを使用して、パラメーターリストを考えることができます。
public class varargtype {static void f(character ... args){system.out.print(args.getclass()); System.out.println( "length" + args.length); } static void g(int ... args){system.out.print(args.getclass()); System.out.println( "length" + args.length); } public static void main(string [] args){f( 'a'); f(); g(1); g(); System.out.println( "int []" + new int [0] .getClass()); }}これはJava 5で導入された機能です。メソッドが受信したいパラメーターの数が不確かな場合、この機能は役に立つ場合があります。
たとえば、IO操作が関与している場合、基本的に少なくとも2つのストリームを閉じる必要があります:入力と出力。ストリームクロージング操作を次の方法にカプセル化するのが好きです。そうすれば、1回のコールで複数のストリームを閉じることができます。
public static void closesilent(closeable ... closeables){for(closeable closeable:closeables){if(closeable!= null){try {closeable.close(); } catch(ioException無視){}}}}これは、この機能が使用に適していると思う唯一の場所であり、次の機能を備えています。
これらのパラメーターは同じタイプです。
パラメーターの数は不確かで、それぞれがオプションです。
これらのパラメーターの使用は同じです。たとえば、上記はすべて閉鎖されて実行されます。
Java変数長パラメーターリストは、メソッドパラメーターリストの最後にのみ配置できます。
Java変数長パラメーターリストの実装
Java変数長のパラメーターリストの実装は、コンパイラに渡され、これらのパラメーターを配列にカプセル化します。
たとえば、上記の方法の署名は、実際には次のとおりです。
ピットを踏む
2つの場所でAとBによって呼び出される方法があります。 9月には、パラメーターをAに追加する必要があります。私の心が狂ったとき、私は可変長パラメーターリストを使用することにしました。私はそれをBに変更する必要がないと感じたので、ピットは埋葬されました。
最近、ここに2つの新しいパラメーターを追加するようにBに依頼したため、メソッドのパラメーターリストにパラメーターを追加し続けます。これらのパラメーターのタイプは異なるため、可変長パラメーターリストはオブジェクトタイプとして宣言されます。
最初のピットは、この方法で可変長パラメーターを持つ要素を使用する場合、一部のパラメーターが渡されず、配列がオフサイドの例外が直接破壊されることを考慮していないことです。私はすぐに、可変長のパラメーターリストが良くないと感じたので、それを必要とせず、通常の固定型パラメーターの渡されたものに変更しました。
変更後、テスト環境でテストしても問題ありません。生産環境のいくつかのクラスを交換した後、結果はエラーになります。方法は見つかりません。メソッドの署名に依存しますが、それは配列であり、交換されていません。ソースコードから判断すると、呼び出しの場所を変更する必要はないため、交換することは期待していませんでした。テスト環境は完全にパッケージ化されているため、問題はありません。
メソッドの署名は、コンパイル時に決定されます。ソースコードレベルは変更を必要としないようですが、コンパイルされたクラスを交換する必要がないという意味ではありません。
実際、この場合、不規則なパッケージの場合、ソースコードの定数値を変更した後、定数を定義するクラスファイルのみが置き換えられ、この定数を参照するすべてのクラスファイルを再コンパイルして置き換えることは可能であり、不可解な問題が発生します。本質的にメソッドの署名と同じ問題です。