10

これは、次のようなオブジェクトを宣言するときにインターフェイス/基本クラスの参照を使用する一般的なコーディング プラクティスです。

InterfaceIF ref = new SomeObject();

これにより疎結合が提供され、多くのコードに影響を与えることなく、新しい実装で新しいクラスを変更/作成できることを理解しています。

これはここでも見事に説明されています。

しかし、私が理解できないことの1つは、質問で答えられないことです:

  • インターフェイス/基本クラス参照を使用することでパフォーマンスが影響を受けますか?
  • はいの場合、これはプラスまたはマイナスに影響しますか?
4

1 に答える 1

9

クラスを直接使用すると、速度が速くなる可能性がありますが、遅くなることはありません。JVM が具体的なクラスを認識した場合、"誰を呼び出すか" をある程度認識します。クラスが最終的なものでない限り、サブクラスが存在する可能性があるため、必ずしも正確ではありません。後でロードされる JVM によってまだ認識されていないサブクラスさえあるかもしれません。

  • 最終クラスの場合、メソッド呼び出しはネイティブ CALL 命令に最適化できます。それは些細なケースです。

  • クラスが final ではなく、まだサブクラスがロードされていない場合は、最初のどこかで追加のチェックが 1 つあるだけで同じです。チェックが失敗すると、JVM は楽観的にコンパイルされたこのメソッドを破棄して再コンパイルする必要があります (大したことではありません)。

  • サブクラスがある場合、指定された呼び出しサイトで実際に遭遇したサブクラスの数にすべてが依存します。1つだけの場合、指定されたクラスが期待されるものであることを確認するには、高速チェックで十分です(このテストをループから移動するなどにより、このオーバーヘッドは無視できるようになります)。

  • 候補が多い場合は明らかに遅くなります (バイモルフィックとメガモルフィックの場合は Google)。

明らかに、インターフェイスを介した呼び出しを高速化できるものは何もありません。

複数の実装があり、呼び出しサイトから複数の実装が呼び出される場合、仮想呼び出しディスパッチのオーバーヘッドがあります。詳細については、この回答とこのベンチマークを参照してください。

于 2013-11-11T10:01:04.037 に答える