Чи вважається екземпляр Java-оператора роздумом і що визначає відображення?


24

Я сьогодні обговорював з колегою, чи є використання використання оператора Java instanceofсвого роду рефлексією. І дискусія швидко переросла у те, що насправді визначає рефлексію.

Отже, яке визначення відображення?

І чи instanceofвважається використання "використанням рефлексії"?

І крім того, якщо instanceofце вважається рефлексією, то чи поліморфізм також не є "використанням рефлексії"? Якщо ні, то в чому різниця?


4
Ви майже відповіли на власне запитання. Те, як ви визначаєте "відображення", визначає, чи instanceofє прикладом рефлексії. Звичайно, це десь між звичайним використанням даних та використанням метаданих за допомогою getClass()& friends, але ви можете мати зручні визначення в будь-який інший спосіб.
Кіліан Фот

Чи returnвважається використання "структурним програмуванням"?
СФ.

Відповіді:


22

Це визначення рефлексії згідно вікіпедії:

В інформатиці рефлексія - це процес, за допомогою якого комп'ютерна програма може спостерігати (робити тип самоаналізу) та змінювати власну структуру та поведінку під час виконання.

Я не міг би сказати це краще, і я виділив важливу частину вашого питання. Сказане, так, instanceofвважається використанням рефлексії. Програма спостерігає за її структурою та проводить самоаналіз типу .


3
@Steven Jeuris: Різниця полягає в тому, що if (true)дивиться на значення , а не на тип . Ось чому це не вважається відображенням.
sleske

1
@sleske: Причина, чому я згадував це, через те, що дотримання типу - це такий рудиментарний принцип. Без нього не було б поліморфізму. Технічно кажучи, це означає, що просте переосмислення також може вважатися відображенням (або, принаймні, результатом). Не забувайте другу частину визначення: і змінюйте власну структуру та поведінку під час виконання. Взагалі я підтримав цю відповідь (перевірити другий коментар), але я розумію, звідки взялося питання з ОП. ; p
Стівен Євріс

1
Згідно з цим визначенням рефлексії, чи нормальний поліморфізм також не був би своєрідним відображенням?
Bjarke Freund-Hansen

4
@bjarkef: Я б сказав "ні", оскільки віртуальна відправка, яка використовується поліморфізмом, виконується неявно самою мовою, а не кодом програми, що явно вивчає даний предмет, щоб визначити його характеристики.
Дейв Шерохман

2
@Dave Sherohman: Я також додам, що більшість робіт (налаштування таблиць стрибків тощо) виконується під час компіляції, а не час виконання.
TMN

13

Для наочності я б розглядав дві відповіді.

Теоретично , instanceofє формою відображення, як описано в відповіді Соколов .

В інформатиці рефлексія - це процес, за допомогою якого комп'ютерна програма може спостерігати (робити тип самоаналізу) та змінювати власну структуру та поведінку під час виконання.

Однак практично , коли програміст говорить про використання рефлексії, він зазвичай посилається на набагато більше, ніж просто перевірку, чи є змінна певного типу. Це така зачатка концепція, без якої поліморфізм був би неможливим .

Зверніть увагу, що використання instanceofчасто вказує на кодовий запах, і замість цього часто можна використовувати належний поліморфізм.


1
+1 за потенційний запах коду - не завжди, лише потенційний
Гері Роу

2

Вам може бути цікаво наступна стаття: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Ключовим у цій статті є фрагмент коду, де вони імітують ключове слово "instanceof" за допомогою методу "isInstance" класу "Class", який є частиною функції відображення Java.


Приємне пояснення для Java.
Сокіл

2

Оскільки інші відповіді, визначення у Вікіпедії було змінено (я, мабуть, згоден із цією зміною, але я не був тим, хто це вніс), щоб видалити частину в дужках:

В інформатиці рефлексія - це здатність комп'ютерної програми досліджувати, самоаналізувати та змінювати власну структуру та поведінку під час виконання.

https://en.wikipedia.org/wiki/Type_introspection також спеціально сказано

Інтроспекцію не слід плутати з рефлексією

Я не вважаю instanceof, підпадають під перше визначення: програма аналізує значення, а не свою структуру, і вона не включає в себе будь - якого значення , що представляють структуру програми (в Java: java.lang.Class, java.reflect.Methodі т.д.); ознака рефлексії - робота з такими значеннями.


-5

ТАК, оператор "instanceof" - це форма відображення. Попередні відповіді говорять вам, чому.

"Рефлексія" або "самоаналіз об'єкта / класу" є суперечкою в наші дні, але кілька мов програмування вже з деякого часу використовують частину цієї концепції.

DOT NET (клон Java), (міс) використовує багато.


1
Уууум,… чувак?
Конрад Рудольф

3
Ваше перше речення є правильним та надмірним на тлі попередніх відповідей. В іншому просто неправильно.
Френк Ширар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.