、などという名前の、Statement
他のいくつかのクラスが継承するベースクラスがあります...インスタンスがどの種類のクラスから派生したかを判断するためにステートメントでテストを実行する最良の方法は何ですか?IfStatement
WhereStatement
if
Statement
6 に答える
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
このようなコードは通常、基本クラスにポリモーフィック メソッドがないことを意味することに注意してください。つまり、サブクラスによってオーバーライドされる、おそらく抽象化されdoSomething()
た のメソッドである必要があります。Statement
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
("instanceof" キーワードとは対照的に) この手法の優れた点は、テストクラスをオブジェクトとして渡すことができることです。でも、それ以外は「instanceof」と同じです。
注: 型インスタンス チェックが正しいかどうかについては、意図的に編集を避けました。ええ、ほとんどの場合、ポリモーフィズムを使用する方が適切です。しかし、それはOPが尋ねたものではなく、私は彼の質問に答えているだけです.
あなたの質問に対する答えは instanceof です。
ただし、コードに instanceof が必要な場合は、設計に問題があることを示していることに注意してください。instanceof が正当化される場合もありますが、それらはむしろ例外です。通常、サブクラスが異なる動作をする必要がある場合は、if() の代わりにポリモーフィズムを使用する必要があります。
isAssignableFrom(java.lang.Class)
クラスからあなたの答えです。
これを試して:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
Class.isInstance()メソッドはオブジェクト インスタンスをパラメーターとして受け取るためです。
これはオブジェクト指向の方法ではなく、古いコード/データの二分法への回帰です。これは必ずしも悪いことではありませんが (自分が何をしているのかわかっている場合)、C などの非オブジェクト指向言語に任せるべきです。
適切な設計があれば、そのような動作は必要ありません。コンストラクトの代わりに:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(ベンジスミスのコードを「盗んだ」ことをお詫びします)、実際には、オブジェクト自体にそれ自身のアクティビティの責任を負わせるべきです:
obj.doStuff();
次に、異なるobj
クラスごとに独自の の定義がありdoStuff
ます。それが正しいやり方です。