私が持っているif
でテストを実行するための最良の方法は何ですかなど、WhereStatement
、IfStatement
という名前のいくつかの他のクラスから継承する基底クラス、Statement
、...どのような種類のインスタンスが由来するStatement
クラスを決定するステートメント?ないJavaが持っている試験方法「クラスの一種である」
答えて
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
このテクニック(「instanceof」キーワードとは対照的に)には、テストクラスをオブジェクトとして渡すことができます。しかし、ええ、それ以外は、 "instanceof"と同じです。
注:タイプインスタンスのチェックがの右ののものかどうかについて、私は意図的に編集を避けました。ええ、ほとんどの場合、多型を使用する方が良いです。しかし、それはOPが尋ねたものではなく、私は彼の質問に答えるだけです。
if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
このようなコードは、通常、基本クラスに多型メソッドがないことに注意してください。すなわちdoSomething()
は、サブクラスによってオーバーライドされるStatement
(おそらく抽象的な)のメソッドである必要があります。
追加情報ありがとう!私はそれを見て、デザインを改善するきれいな方法があるかどうかを見ていきます。 –
+1と答えましたが、 'instanceof'には有効な使い方がたくさんあります。これはいつもデザインの匂いではありません。たとえば、 'doSomething()'がwhere節にのみ適用可能ならば、このパターンはおそらくStatementクラスの 'doSomething()'を人工的に作るよりも優れているでしょう(論理的には適合しません)。 – mikera
'instanceof'が役に立つ別の例です。 JavaFXでは、ペインがあります。私は子ノードのツリーを横断する必要があります。 'getChildren()'はノードを返します。しかし、ノードの1つがペインである場合、私は_its_子もトラバースする必要があります。 Nodeは 'getChildren()'メソッドを持たず、それを追加するためのものでもありません。ですから、ノードをペインにキャストしてその子をトラバースする必要があるかどうかを確認するには、 'node instanceof Pane'を使用する必要があります。 – dwilliss
あなたの質問に対する答えはinstanceofです。
しかし、あなたのコードがinstanceofの必要がある場合、それは何かがあなたのデザインの権利ではない兆候だということを覚えておいてください。 instanceofが正当化される場合もあるが、むしろ例外である。通常、あなたのサブクラスが異なる振る舞いをする必要がある場合は、if()の代わりに多態性を使用する必要があります。
私があなたの推薦に追加する唯一のことは、インターフェイスによるプログラミングの強力な提案です。 – monksy
これはではありません。オブジェクト指向の方法を行う方法です。これは古いコード/データの二分法の後戻りです。今(あなたは何をやっている知っていれば)、それは必ずしも悪いことではないのですが、それは適切な設計によりC.
のような非オブジェクト指向言語に委ねられるべき、あなたは行動の並べ替えをする必要はありません。代わりに、コンストラクトの:次に
obj.doStuff();
それぞれ異なるobj
:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(謝罪は、彼のコードを「盗む」のbenjismithする)、あなたは本当にため、自身の活動のためのオブジェクト自体は責任を作るべきですクラスにはdoStuff
の独自の定義があります。それが正しい方法です。クラスから
サブクラスだけがdoStuff(™paxdiabio)を実行でき、サブクラスのスーパークラスであるオブジェクトの配列を持っている場合は、これを行うより良い方法です(no-op'dを追加するのではなく) doStuffメソッドを無意味な(または「ちょうど間違っている」)スーパークラスに変換します。 – geowar
@geowar、非同質のもののコレクションを持っているなら、それらはおそらくコレクション内にあってはいけません。または、少なくとも、あなたは、そのコレクションをdoStuffにしたいと思うように繰り返すべきではありません。これを処理する方法はいろいろありますが、クラス名や型に結びつけることは変更を加えるときに非常に問題になります。継承/オブジェクト指向の世界では、このケースで何もしたくないスーパークラスのnull関数を持つことは、実際には有効な解決策であり、処理コードをもっときれいにします。 – paxdiablo
isAssignableFrom(のjava.lang.Class)は、あなたの答えです。 http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
これを試してください:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
Class.isInstance()のでメソッドは、パラメータとしてオブジェクト・インスタンスを取ります。
- 1. Java Associate試験とJava Programmer試験の違いは何ですか
- 2. のJava - 次がある私は、クラスを持っているParentclass
- 3. 一般的な方法は、私はアイテムのコレクションを持っているJavaの
- 4. 汎用Javaクラスは、私が比較対象を格納し、一般的なJavaクラスを持っている
- 5. キュウリ試験のJavaの例?
- 6. Javaは - 私は、以下のクラス構造を持っている一般的な方法から
- 7. Java EE 6試験材料
- 8. $ ProxyXは私が持っている私のJavaクラスのmy.package.DefaultCustomerProviderImpl
- 9. 明日の最終試験合同試験が必要です
- 10. MCQ試験でユーザ回答を維持する最良の方法
- 11. 酸性試験の作成方法は?
- 12. なぜセレン試験が遅いのですか?
- 13. は、私が持っているJavaの
- 14. アンドロイド活性試験 - 試験再起動
- 15. Mockito。私はこの方法を持っているpaticularクラス
- 16. ユニットテストとSRP(試験方法スコープ/団体)
- 17. 種類の不一致私はこのコードを持っているのXPages
- 18. NHibernateがクラスであるプロパティを持つモデルを持っています
- 19. なぜ匿名クラスは、私は、Javaの匿名クラスが何であるかについての誤解を持っている静的コンテキストで有効
- 20. **私は、ソケットやネットワークの開発で多くの経験を持っていないTcpListenerクラス
- 21. キュウリ試験でなぜこれが起こるのですか?
- 22. キュウリ試験でモデルをモック/スタブする方法
- 23. ANT試験にJavaシステムプロパティを渡す
- 24. 固有の種類のクラスでしか使用できないメソッドがある
- 25. は、私はクラスが非常に次のようになります持っている2種類
- 26. NHibernateの一対多集・私は、次のクラス持っている唯一のスーパー
- 27. ルビーThread.newは、私がコードの一部を持っているクラスのコール
- 28. セレン試験機
- 29. 次のように私が持っている疑問があるのjava
- 30. 誰もがモノでCSLAを使っている経験がありますか?
単純なinstanceofチェックを使用するだけではどうですか? –
instanceofはgotoのように邪悪ではありません。言語に追加された理由と、その言語が非推奨になっていない理由があります。 –
+1は「タイプインスタンスのチェックが正しいことかどうかについて編集しない」ため –