web-dev-qa-db-ja.com

Javaは「クラスの一種」テストメソッドを持っていますか?

StatementIfStatementなど、他のいくつかのクラスが継承する基本クラスWhereStatementがあります。ifステートメントでテストを実行して、インスタンスの派生元であるStatementクラスの種類を判別する最良の方法は何ですか。

28
Heat Miser
if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}

この手法の( "instanceof"キーワードとは対照的な)優れた点は、テストクラスをオブジェクトとして渡すことができることです。しかし、そうです、それ以外は、「instanceof」と同じです。

注:type-in​​stance-checkingがrightを実行するかどうかを編集することを意図的に避けています。ええ、ほとんどの場合、ポリモーフィズムを使用する方が良いでしょう。しかし、それはOPが尋ねたものではなく、私は彼の質問に答えるだけです。

62
benjismith
_if(object instanceof WhereStatement) {
   WhereStatement where = (WhereStatement) object;
   doSomething(where);
}
_

このようなコードは通常、基本クラスにポリモーフィックメソッドがないことを意味します。つまり、doSomething()は、サブクラスによってオーバーライドされるStatementのメソッドであり、抽象的である必要があります。

76
Dave Ray

あなたの質問への答えはinstanceofです。

ただし、コードにinstanceofが必要な場合は、デザインに問題があることを示しています。 instanceofが正当化される場合がありますが、それらはかなり例外です。通常、サブクラスが異なる動作をする必要がある場合は、if()の代わりにポリモーフィズムを使用する必要があります。

6
Igor Krivokon

クラスのisAssignableFrom(Java.lang.Class)が答えです。 http://download.Oracle.com/javase/6/docs/api/Java/lang/Class.html#isAssignableFrom(Java.lang.Class

2
Akshay

これを試して:

if (Statement.class.isInstance(obj)) {
    doStuffWithStatements((Statement) obj));
}

なぜなら、 Class.isInstance() メソッドは、オブジェクトインスタンスをパラメーターとしてとるからです。

1
tayfun öztemel

これはnotがオブジェクト指向の方法で物事を行う方法であり、古いコードとデータの二分法への逆戻りです。これは必ずしも悪いことではありません(何をしているのかわかっている場合)が、Cなどの非オブジェクト指向言語に任せる必要があります。

適切な設計では、そのような動作は必要ありません。構成の代わりに:

if (obj.getClass().isInstance(Statement.class)) {
    doStuffWithStatements((Statement) obj));
}

(彼のコードを「盗む」ことに対するベンジスミスへの謝罪)、あなたは本当にオブジェクト自体をそれ自身の活動に責任があるようにするべきです:

obj.doStuff();

次に、異なるobjクラスごとに、doStuffの独自の定義があります。それが正しい方法です。

0
paxdiablo