130

getClass()演算子よりもand==演算子を使用すると、パフォーマンスが向上し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?

シナリオを考えると、一致する正確なクラス、つまりStringInteger(これらは最終クラスです)などを知っています。

instanceOfオペレーターの悪い習慣を使用していますか?

4

4 に答える 4

160

instanceofとの性能getClass() == ...が違うのは、やっていることが違うからです。

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

  • getClass() == ... タイプが同一かどうかをテストします。

したがって、パフォーマンスの問題を無視して、必要な答えが得られる代替手段を使用することをお勧めします。

instanceOf演算子の悪い習慣を使用していますか?

必ずしも。どちらかの使いすぎはinstanceOf「デザイン臭」getClass() かもしれません。注意しないと、新しいサブクラスの追加によって大量のコードの再作業が必要になる設計になってしまいます。ほとんどの場合、好ましいアプローチはポリモーフィズムを使用することです。

ただし、これらが「デザイン臭」でない場合もあります。たとえばequals(Object)、引数の実際の型をテストし、false一致しない場合は返す必要があります。これは、 を使用して行うのが最適getClass()です。


「ベスト プラクティス」、「バッド プラクティス」、「デザインの匂い」、「アンチパターン」などの用語は慎重に使用し、疑いを持って扱う必要があります。彼らは白黒思考を奨励します。純粋にドグマに基づいて判断するよりも、文脈に基づいて判断する方がよいでしょう。たとえば、誰かが言ったことは「ベストプラクティス」です。まだ読んでいない場合は、No Best Practicesを読むことをお勧めします。

于 2011-02-14T07:44:15.207 に答える
48

クラスを正確に一致させたいですか?たとえばFileInputStream、のサブクラスではなく一致のみを行いFileInputStreamますか? その場合は、 と を使用getClass()==ます。equalsX のインスタンスが X のサブクラスのインスタンスと等しいと見なされないように、私は通常これを で行います。そうしないと、トリッキーな対称性の問題が発生する可能性があります。一方、これは通常、2 つのオブジェクトが特定の 1 つのクラスよりも同じクラスに属していることを比較する場合に役立ちます。

それ以外の場合は、 を使用しますinstanceof。最初のオペランドが null の場合は単に返されるのに対し、最初getClass()に null 以外の参照があることを確認する必要があることに注意してください。NullPointerExceptioninstanceoffalse

instanceof個人的には、より慣用的だと思いますが、どちらかを広範囲に使用することは、ほとんどの場合、デザインの臭いです.

于 2011-02-14T07:43:05.480 に答える
18

これが尋ねられてからしばらく経っていることは知っていますが、昨日別の方法を学びました

私たちは皆、あなたができることを知っています:

if(o instanceof String) {   // etc

しかし、必要なクラスのタイプが正確にわからない場合はどうすればよいでしょうか? 一般的にはできません:

if(o instanceof <Class variable>.getClass()) {   

コンパイルエラーになるからです。
代わりに、これが代替手段です - isAssignableFrom()

例えば:

public static boolean isASubClass(Class classTypeWeWant, Object objectWeHave) {

    return classTypeWeWant.isAssignableFrom(objectWeHave.getClass())
}
于 2012-09-26T20:55:01.983 に答える