Rozmawiałem dziś ze współpracownikiem, czy użycie operatora Java instanceof
jest rodzajem refleksji. Dyskusja szybko przekształciła się w to, co faktycznie definiuje odbicie.
Jaka jest definicja odbicia?
A czy użycie instanceof
rozważanego „używania odbicia”?
A jeśli instanceof
rozważa się odbicie, to czy polimorfizm również nie „używa odbicia”? Jeśli nie, jaka jest różnica?
java
language-agnostic
language-features
reflection
Bjarke Freund-Hansen
źródło
źródło
instanceof
jest to przykład odbicia. Z pewnością jest to gdzieś pomiędzy normalnym wykorzystaniem danych a wykorzystaniem metadanych za pośrednictwemgetClass()
& Friends, ale możesz mieć funkcjonalne definicje w inny sposób.return
rozważanego „programowania strukturalnego”?Odpowiedzi:
Oto definicja odbicia według Wikipedii:
Nie mógłbym tego lepiej powiedzieć i podkreśliłem ważną część twojego pytania. To powiedziawszy,
instanceof
jest uważane za odbicie. Program obserwuje jego strukturę i przeprowadza introspekcję typu .źródło
if (true)
patrzy się na wartość , a nie na typ . Dlatego nie uważa się tego za odbicie.Dla jasności rozważę dwie odpowiedzi.
Teoretycznie ,
instanceof
jest formą refleksji, jak wyjaśniono w odpowiedzi Sokoła .Jednak w praktyce , gdy programista mówi o zastosowaniu odbicia, zwykle odnosi się do czegoś więcej niż tylko sprawdzania, czy zmienna jest określonego typu. To taka szczątkowa koncepcja, bez której polimorfizm nie byłby możliwy .
Zauważ, że używanie
instanceof
często oznacza zapach kodu, a zamiast tego można często zastosować właściwy polimorfizm.źródło
Możesz być ciekawy w następującym artykule: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Kluczem w tym artykule jest fragment kodu, w którym symulują słowo kluczowe „instanceof” za pomocą metody „isInstance” klasy „Class”, która jest częścią funkcji odbicia Java.
źródło
Od innych odpowiedzi definicja w Wikipedii została zmieniona (akurat zgadzam się z tą zmianą, ale to nie ja ją wprowadziłem), aby usunąć część w nawiasach:
https://en.wikipedia.org/wiki/Type_introspection również wyraźnie mówi
Nie uważam
instanceof
, aby spaść poniżej pierwszej definicji: program analizuje wartość, a nie swoją własną strukturę i nie pociąga za sobą żadnych wartości reprezentujących strukturę programu (w Java:java.lang.Class
,java.reflect.Method
itd); cechą refleksji jest praca z takimi wartościami.źródło
TAK, operator „instanceof” jest formą refleksji. Poprzednie odpowiedzi podpowiadają dlaczego.
„Refleksja” lub „introspekcja obiektów / klas” jest w dzisiejszych czasach szumem, ale kilka języków programowania od pewnego czasu używa tej koncepcji.
DOT NET (klon Java), (mis) używa dużo.
źródło