2011-08-10 14 views
5

JavaのCollections.checked *()APIは、基本となるコレクションに型保証されたビューを提供します。しかし、チェックは実行時に行われ、実行時の例外がスローされるため、パフォーマンスにコストがかかる可能性があります。コンパイル時にジェネリックコレクションを使用して特定の型を指定することで、同じ型チェックを適用することができます。 Collections.checked *()は、タイプが指定されたジェネリックコレクションをスコアリングする状況がありますか?Java Collections.checked *()vs汎用コレクション

答えて

10

javadocはそれをうまく説明:

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection%28java.util.Collection,%20java.lang.Class%29

言語でのジェネリックメカニズムは、コンパイル時(静的)型チェックを提供していますが、未チェックのキャストでこのメカニズムを打ち負かすことが可能です。コンパイラはチェックされていないすべての操作について警告を出すので、通常これは問題ではありません。しかし、静的型検査のみでは不十分な場合があります。たとえば、コレクションがサードパーティのライブラリに渡され、間違った型の要素を挿入することによってライブラリコードがコレクションを破損しないようにする必要があるとします。

0

新しい1.5+プロジェクトで未チェックのタイプの古いライブラリを使用している場合。

+1

あなたは財務会社で仕事をしているので、図書館を変更して数ヶ月の官僚的プロセスに直面する必要があるときには、そうです。そうです、より良い仕事をすべきです.... –

5

主な違いは、誤って意識的にコンパイル時のチェックを簡単に回避できることです。

コンパイラは警告が表示されますが、警告が簡単に無視され、ライブラリのどこかで問題が発生する可能性があります。ジェネリックによって提供される型情報は、という信頼性がありますが、関連するすべてのコードがジェネリックに関する警告なしでコンパイルされる場合は、のみがコンパイルされます。

Collections.checked*()を使用すると、独自のコレクションを渡すことができる限り、コントロールの外にあるコードを使用する場合でも、制限を適用することができます。

1

Collectons.checkedXxxxx()は、ランタイムチェックを実行するため、安全性が向上します。コンパイラは型の削除を使用することで回避できますが、チェックされたコレクションは型が正しいことを常に確認する必要があります。

私はパフォーマンスの違いを気にするのには間違いがあります。約10ns以下になる可能性があります。

関連する問題