インターフェイスに定義メソッドがあることがわかった場合:
public string [] getParameters();
その後、あなたは真剣に反映する必要があります。配列は古いものであるだけでなく、暴露を避ける合理的な理由があります。この記事では、Java APIの配列の欠陥を要約しようとします。最も予想外の例の1つから始めます。
アレイはパフォーマンスの低下につながります
アレイはほとんどのコレクションで実装されている基礎となるデータ構造であるため、配列の使用が最速であると思うかもしれません。純粋な数字グループの使用は、配列オブジェクトを使用するよりもどのように低くできますか?
おなじみに見えるこの一般的な習慣の使用から始めましょう:
public string [] getNames(){return nameslist.toarray(new String [nameslist.size()];}このメソッドは、内部保存データが使用される変数コレクションを作成します遅いです(チャートの緑色とオレンジ色のバーを参照してください):
public string [] getNames(){return nameslist.toarray(new String [0]);}ただし、メソッドがリストを返した場合、防御コピーの作成はより速い(赤いバー):
public list <string> getNames(){return new arrayList(nameslist);}違いは、ArrayListがオブジェクト[]アレイに配置し、タイプのメソッド(青いバー)よりもはるかに高速なToArrayメソッドを使用します配列のタイプはありません。カプセル化は、一般的なタイプのコンパイラでカプセル化されます。
このアイコンは、Java 7のn = 5の参照標準を示しています。ただし、より多くのVM状況システムでは、この画像はあまり変化しませんが、成長する必要がありますそれを使用してコレクションに変換し、結果をアレイに戻して別のインターフェイスメソッドに送信します。
パフォーマンスを改善するために、アレイの代わりに単純なアレイリストを使用しますバイト。
コレクションを使用して、内部リストの未修飾バージョンを返すこともできます。
public list <string> getNames(){return collections.unmodifiablelist(nameslist);}この操作は固定された市場価格で実行されるため、彼は他のどの方法よりもはるかに高速です(黄色のバー)。変更を変更できないことは、内部データが変更されると変更されます。変更が発生した場合、クライアントはデータ項目を繰り返したときに、インターフェイスを使用すると、少なくとも内部使用の場合、この方法を提供します。 、それはアレイでは実装できない高性能の選択 - あるものになります。
配列は、インターフェイスではなく構造を定義します
Javaはオブジェクト指向の言語です。オブジェクト指向の概念は、データドメインを直接操作する代わりに、データにアクセスして操作する方法を提供することです。
Javaはパフォーマンスを設計しているため、ネイティブシステムはタイプシステムに統合されています直接的なアクセスでは、アレイには他にも多くのことがありません。
string [] array = {foo "、" bar "} list = aslist(array); println(array); // - > [ljava.lang.string;@6f548414 list(arrays.aslist( "foo"、 "bar"))//-> truerray.equals [] {"fooo "、" bar "})//-> falseアレイとは異なり、コレクションAPIは、要素にアクセスするための多くの有用な方法を提供します。また、実装の原則を同時に維持します。
データを使用することにより、データがメモリで保存される場所を定義します。
配列は安全なタイプではありません
コンパイラチェックのタイプに依存している場合は、オブジェクトアレイに注意してください。
番号[] new Integer [10] = long.valueof(0);
その理由は、アレイが「コラボレーション」であるため、tがsのサブタイプである場合、t []はs []のすべての理論をカバーします。すべての理論とすべての理論をカバーするすべてのJava開発者は読む必要があります。
この動作により、露出した配列タイプのインターフェイスにより、配列タイプの宣言のサブタイプが可能になり、これにより奇妙なランタイム異常が生じます。
Blochは、アレイがジェネリックタイプと互換性がないことも説明しました。アレイはランタイム中にタイプ情報を要求するため、汎用型をチェックすると、ジェネリックタイプを配列に配置できません。
- ジョシュアブロック、効果的なJava(第2版)、第29条
要約します
アレイの下層の言語構造は、実装で使用されますが、1つのインターフェイスメソッドを使用して、オブジェクト指向の原則に違反します。