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?


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 .


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.


1
+1 za potencjalny zapach kodu - nie zawsze, tylko potencjał
Gary Rowe


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.


-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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.