1. ホーム
  2. java

[解決済み] instanceof Vs getClass( )

2022-02-15 09:51:32

質問

を使用すると、パフォーマンスが向上することが確認されています。 getClass()== 演算子 instanceOf 演算子を使用します。

Object  str = new Integer("2000");

long starttime = System.nanoTime();

if(str instanceof String) {
    System.out.println("its string");
} else {
    if (str instanceof Integer) {
        System.out.println("its integer");

    }
}

System.out.println((System.nanoTime()-starttime));

starttime = System.nanoTime();

if(str.getClass() == String.class) {
    System.out.println("its string in equals");
} else {
    if(str.getClass() == Integer.class) {
        System.out.println("its integer");
    }
}

System.out.println((System.nanoTime()-starttime));

どれを使えばいいのか、ガイドラインはありますか? getClass() または instanceOf ?

あるシナリオが与えられたとき、私はマッチングされるべき正確なクラスを知っています。 String , Integer (これらは最終クラスです)など。

を使用していますか? instanceOf 演算子を使うのは悪いことですか?

解決方法は?

のパフォーマンスが低下する原因は instanceofgetClass() == ... が違うのは、やっていることが違うということです。

  • instanceof 左側 (LHS) のオブジェクト参照が右側 (RHS) の型のインスタンスであるかどうかをテストします。 または何らかのサブタイプ .

  • getClass() == ... は、型が同じかどうかをテストします。

ですから、パフォーマンスの問題は無視して、必要な答えを与えてくれる代替手段を使うことをお勧めします。

を使用することは可能ですか? instanceOf 演算子を使うのは悪い習慣ですか?

必ずしもそうとは限りません。 どちらかを多用することで instanceOf または getClass() かもしれない デザイン臭がする。 気をつけないと、新しいサブクラスを追加したときに、かなりの量のコードの手直しが発生するようなデザインになってしまいます。 ほとんどの場合、ポリモーフィズムを使用するのが望ましい方法です。

しかし、これが "design smell" "ではないケースもあります。 例えば equals(Object) は、引数の実際の型をテストする必要があります。 false にマッチしない場合は これを行うには getClass() .


ベストプラクティス、バッドプラクティス、デザイン臭、アンチパターンなどという言葉は、あまり使わず、疑ってかかるべきでしょう。 これらは白か黒かの思考を助長します。 誰かが言ったベストプラクティスであるなど、純粋にドグマに基づいて判断するのではなく、文脈から判断する方がよいのです。 私は、すべての人に以下を読むことをお勧めします。 ベストプラクティスなし まだの方は、ぜひご覧ください。