もちろん、最適化に取り組む前に、実際にパフォーマンスの問題があるかどうかを確認する必要があります。getClass()
おそらくすでにかなり高速です(instanceof
とにかく、より高速です)。パッケージ名をチェックし続ける必要がないように、メタデータ パッケージにある一連のクラスをキャッシュすることができます。
本当にパッケージを比較する必要がある場合は、一度Package.getPackage(String name)メソッドを使用してメタデータ パッケージを見つけてから、オブジェクトごとgetClass().getPackage()
に前と同じように呼び出して、2 つのパッケージ オブジェクトを比較します。
==
これは、パッケージ名の文字列をチェックするよりも迅速で洗練されていますが、複数のクラスローダーがある場合、Package オブジェクトが等しくなく ( )、Package がオーバーライドされないため、おそらく正しく機能しません.equals()
。考えてみると、単一のクラスローダーで動作することさえ保証されていないかもしれませんが、実際には、別のコピーではなく同じ Package インスタンスを取得するのではないかと思います-これを最初に確認するのが賢明です!例えば:
String.class.getPackage() == Integer.class.getPackage() // should be true
のソースコードをチェックして更新するとClass.getPackage()
、それらがオブジェクトをキャッシュしていることがわかるので、単一のクラスローダーを使用するときにそれらを安全に比較できるはずですPackage.getPackage()
ClassLoader.getPackage()
Package
パッケージの命名規則の問題点の 1 つは、コードベース全体でそれを強制および維持する必要があることです。これは、時間の経過とともに保守の問題になる可能性があります。クラスを識別するより明示的な方法の方がよい場合があります。
クラスの特定のグループを識別する代替アプローチには、次のものがあります。
- メタデータ Bean にマーカー インターフェイスを実装させる
- Java アノテーションを使用してメタデータ Bean をマークする
- すべてのBeanに、定義した特定のカテゴリにあるかどうかを確認するために呼び出すことができるメソッドを使用して、共通のインターフェイスを実装させます。これは基本的に型システムを複製しているので醜いですが、リフレクションを必要としないので高速です。