私が持っている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. シンプルなEmber.js試験方法
- 4. 反応成分の試験方法が機能しない
- 5. 試合&Iが持っているSQL
- 6. はなぜJavaのジェネリックメソッドの引数のクラスは、私は一般的な方法を持っている
- 7. RSpecの:試験方法
- 8. 私は、これらのクラスを持っている一般的な方法
- 9. 一般的な方法は、私はアイテムのコレクションを持っているJavaの
- 10. は私が持っているJavaクラスのバイト数でJRubyの
- 11. WebDriverがキュウリ試験でインスタンス化されていない
- 12. 汎用Javaクラスは、私が比較対象を格納し、一般的なJavaクラスを持っている
- 13. キュウリ試験のJavaの例?
- 14. は唯一私がクラスを持っているクラス変数
- 15. 私の酵素/モカ試験で何が問題になっていますか?
- 16. ラテックスの試験クラスのないMCQ質問
- 17. Javaは - 私は、以下のクラス構造を持っている一般的な方法から
- 18. 試験方法を模擬してApexAsynJob
- 19. は、私が持っている最初のクラスでは別のクラス(Java)の
- 20. Java EE 6試験材料
- 21. $ ProxyXは私が持っている私のJavaクラスのmy.package.DefaultCustomerProviderImpl
- 22. JAVAのリファレンスは、私はクラスを持っている他のクラス
- 23. Pax試験karaf maven試験
- 24. ユニットテスト回避クラスBのコンストラクタ呼び出し試験方法
- 25. スイフト: '? :クラス」式が不一致のタイプ持っている 'と' と '()'
- 26. 各Jenkinsジョブのキュウリ試験結果の維持方法
- 27. 私はこれが私のクラスであるrecyclerview.Adapterクラスを持っているRecyclerView.Adapter
- 28. は、私が持っているプロジェクトがあり、共通のクラス
- 29. Java、Exception、最良の方法、試験準備
- 30. 明日の最終試験合同試験が必要です
単純なinstanceofチェックを使用するだけではどうですか? –
instanceofはgotoのように邪悪ではありません。言語に追加された理由と、その言語が非推奨になっていない理由があります。 –
+1は「タイプインスタンスのチェックが正しいことかどうかについて編集しない」ため –