Java instanceof演算子はリフレクションと見なされますか?


24

Java演算子を使用することinstanceofは一種の反省かどうか、今日同僚と話し合いました。そして、議論はすぐに実際に反射を定義するものに進化しました。

だから、反射の定義は何ですか?

そして、instanceof考慮された「反射を使用する」の使用法はありますか?

さらに、instanceof反射と見なされる場合、多型も「反射を使用する」わけではありませんか?そうでない場合、違いは何ですか?


4
あなたはほとんど自分の質問に答えました。「リフレクション」の定義方法によってinstanceof、リフレクションの例であるかどうかが決まります。確かに、それは通常のデータ使用とメタデータの使用の間のどこかにありgetClass()ますが、方法なしで実行可能な定義を持つことができます。
キリアンフォス

return考慮された「構造プログラミング」の使用はありますか?
SF。

回答:


22

これは、ウィキペディアによる反射の定義です。

コンピューターサイエンスでは、リフレクションとは、コンピュータープログラムが実行時に自身の構造と動作を観察(タイプイントロスペクション)し、変更できるプロセスです。

私は自分でそれをもっとうまく言うことはできず、あなたの質問の重要な部分を強調しました。そうは言っても、はい、instanceofリフレクションを使用すると考えられます。プログラムはその構造を観察し型の内省を行います。


3
@Steven Jeuris:違いは、タイプではなくif (true)見るということです。それが反射とは見なされない理由です。
-sleske

1
@sleske:型を観察することは基本的な原理であるため、私がそれを述べた理由はそうでした。それがなければ、ポリモーフィズムはありません。技術的に言えば、これは単純なオーバーライドがリフレクション(または少なくとも結果として)と見なされることを意味します。定義の2番目の部分を忘れないでください。実行時に独自の構造と動作を変更します。全体として、私はこの答えを支持しました(2番目のコメントを確認してください)が、OPからの質問がどこから来たのか理解しています。; p
スティーブンジュリス

1
反射のその定義によると、通常の多型も一種の反射ではありませんか?
Bjarkeフロイント・ハンセン

4
@bjarkef:ポリモーフィズムで使用される仮想ディスパッチは、アプリケーションコードが問題のオブジェクトを明示的に調べてその特性を識別するのではなく、言語自体によって暗黙的に行われるため、「いいえ」と言います。
デイブシェロマン

2
@Dave Sherohman:また、ほとんどの作業(ジャンプテーブルの設定など)は実行時ではなくコンパイル時に行われると付け加えます。
TMN

13

明確にするために、2つの答えを検討します。

理論的instanceofは、Falconの答えで説明されているように、反射の形式です。

コンピューターサイエンスでは、リフレクションとは、コンピュータープログラムが実行時に自身の構造と動作を観察(タイプイントロスペクション)し、変更できるプロセスです。

ただし、実際には、プログラマがリフレクションの使用について話すとき、通常、変数が特定の型であるかどうかを確認するだけではありません。これはそのような初歩的な概念であり、それなしではポリモーフィズムは不可能です。

instanceof頻繁に使用することはコードのにおいを示し、代わりに適切な多態性を使用することが多いことに注意してください。


1
潜在的なコードの匂いのために+1-常にではなく、単に潜在的である
ゲイリーロウ


2

他の回答以降、Wikipediaの定義が変更されました(たまたまこの変更に同意しましたが、私が作成したのは私ではありませんでした)。

コンピューターサイエンスでは、リフレクションとは、コンピュータープログラムが実行時に自身の構造と動作を調べ、内省し、変更する能力です。

https://en.wikipedia.org/wiki/Type_introspectionも具体的に言う

イントロスペクションとリフレクションを混同しないでください

私は考えていないinstanceofプログラムが値ではなく、独自の構造を調べ、それが(Javaで:プログラム構造を表す任意の値を含まない:最初の定義に該当するjava.lang.Classjava.reflect.Methodなど)。反射の特徴は、そのような値で機能しています。


-5

はい、「instanceof」演算子は反射の形式です。前の回答で理由がわかります。

「Reflection」または「object / class introspection」は最近誇大宣伝されていますが、いくつかのプログラミング言語では、いつかその概念の一部を使用しています。

DOT NET(Javaクローン)、(mis)は多く使用します。


1
うううううううう…
コンラッドルドルフ

3
最初の文は正しく、以前の回答に直面して冗長です。残りは間違っています。
フランクシェラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.