Czy operator Java instancji jest rozważany jako odbicie i co definiuje odbicie?

24

Rozmawiałem dziś ze współpracownikiem, czy użycie operatora Java instanceofjest rodzajem refleksji. Dyskusja szybko przekształciła się w to, co faktycznie definiuje odbicie.

Jaka jest definicja odbicia?

A czy użycie instanceofrozważanego „używania odbicia”?

A jeśli instanceofrozważa się odbicie, to czy polimorfizm również nie „używa odbicia”? Jeśli nie, jaka jest różnica?

Bjarke Freund-Hansen
źródło
4
Prawie odpowiedziałeś na swoje pytanie. Sposób definiowania „odbicia” określa, czy instanceofjest to przykład odbicia. Z pewnością jest to gdzieś pomiędzy normalnym wykorzystaniem danych a wykorzystaniem metadanych za pośrednictwem getClass()& Friends, ale możesz mieć funkcjonalne definicje w inny sposób.
Kilian Foth,
Czy stosowanie returnrozważanego „programowania strukturalnego”?
SF.

Odpowiedzi:

22

Oto definicja odbicia według Wikipedii:

W informatyce odbicie jest procesem, w którym program komputerowy może obserwować (przeprowadzać introspekcję) i modyfikować własną strukturę i zachowanie w czasie wykonywania.

Nie mógłbym tego lepiej powiedzieć i podkreśliłem ważną część twojego pytania. To powiedziawszy, instanceofjest uważane za odbicie. Program obserwuje jego strukturę i przeprowadza introspekcję typu .

Sokół
źródło
3
@Steven Jeuris: Różnica polega na tym, że if (true)patrzy się na wartość , a nie na typ . Dlatego nie uważa się tego za odbicie.
sleske,
1
@sleske: Powodem, dla którego wspomniałem, było to, że obserwowanie typu jest tak podstawową zasadą. Bez tego nie byłoby polimorfizmu. Technicznie rzecz biorąc oznacza to, że proste zastąpienie można również uznać za odbicie (lub przynajmniej skutkuje). Nie zapomnij o drugiej części definicji: i zmodyfikuj własną strukturę i zachowanie w czasie wykonywania. Podsumowując, głosowałem za odpowiedzią (sprawdź mój drugi komentarz), ale rozumiem, skąd pochodzi pytanie z PO. ; p
Steven Jeuris
1
Czy zgodnie z tą definicją odbicia normalny polimorfizm również nie byłby rodzajem odbicia?
Bjarke Freund-Hansen
4
@bjarkef: Powiedziałbym „nie”, ponieważ wirtualna wysyłka używana przez polimorfizm odbywa się w sposób dorozumiany przez sam język, a nie kod aplikacji jawnie badający dany obiekt w celu zidentyfikowania jego właściwości.
Dave Sherohman,
2
@Dave Sherohman: Dodałbym również, że większość pracy (konfiguracja tabel skoków itp.) Jest wykonywana w czasie kompilacji, a nie w czasie wykonywania.
TMN
13

Dla jasności rozważę dwie odpowiedzi.

Teoretycznie , instanceofjest formą refleksji, jak wyjaśniono w odpowiedzi Sokoła .

W informatyce odbicie jest procesem, w którym program komputerowy może obserwować (przeprowadzać introspekcję) i modyfikować własną strukturę i zachowanie w czasie wykonywania.

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 instanceofczęsto oznacza zapach kodu, a zamiast tego można często zastosować właściwy polimorfizm.

Steven Jeuris
źródło
1
+1 za potencjalny zapach kodu - nie zawsze, tylko potencjał
Gary Rowe
2

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.

Jalayn
źródło
Ładne wyjaśnienie dla Javy.
Falcon
2

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:

W informatyce refleksja to zdolność programu komputerowego do badania, introspekcji i modyfikowania własnej struktury i zachowania w czasie wykonywania.

https://en.wikipedia.org/wiki/Type_introspection również wyraźnie mówi

Introspekcji nie należy mylić z refleksją

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.Methoditd); cechą refleksji jest praca z takimi wartościami.

Aleksiej Romanow
źródło
-5

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.

umlcat
źródło
1
Uuuuhm… koleś?
Konrad Rudolph,
3
Twoje pierwsze zdanie jest poprawne i zbędne w porównaniu z poprzednimi odpowiedziami. Reszta jest po prostu błędna.
Frank Shearar,