Java instanceof operatörü yansıma olarak kabul edilir mi ve yansımayı ne tanımlar?


24

Bugün bir iş arkadaşınızla tartışmıştım, Java operatörünü instanceofkullanmanın bir tür yansıma olup olmadığı . Tartışma hızla yansımayı tanımlayan şey haline geldi.

Peki, yansıma tanımı nedir?

Ve instanceof"yansıma kullanma" olarak kabul edilen kullanım mı?

Ek olarak, eğer instanceofyansıma olarak kabul edilirse , o zaman polimorfizm de "yansıma kullanmak" değil midir? Değilse, fark nedir?


4
Kendi sorunuzu hemen hemen cevapladınız. Yansımayı nasıl tanımladığınız instanceof, bir yansıma örneği olup olmadığını belirler . Kuşkusuz normal veri kullanımı ile getClass()& arkadaşları aracılığıyla meta veri kullanımı arasında bir yerlerdedir , ancak uygulanabilir tanımları daha zor bir şekilde yapabilirsiniz.
Kilian Foth

return"Yapısal programlama" olarak kabul edilir mi?
SF.

Yanıtlar:


22

Bu , wikipedia'ya göre yansıma tanımıdır:

Bilgisayar bilimlerinde yansıma, bir bilgisayar programının gözlemleyebildiği (inceleme türü yapabileceği) ve çalışma zamanında kendi yapısını ve davranışını değiştirebildiği süreçtir .

Kendimi daha iyi söyleyemedim ve sorunuzun önemli kısmını vurgulayamadım Bu, evet, instanceofyansıma kullanarak kabul edilir. Program yapısını gözlemler ve tip incelemesi yapar .


3
@Steven Jeuris: Fark, bir türe değil if (true)bir değere bakmaktır . Bu yüzden yansıma sayılmaz.
sleske

1
@sleske: Bundan bahsetmemin nedeni, bir türü gözlemlemenin ilkel bir ilke olduğudur. O olmadan polimorfizm olmazdı. Teknik olarak söylemek gerekirse, basit bir geçersiz kılma da yansıma olarak kabul edilebilir (veya en azından sonuçlanır) anlamına gelir. Tanımın ikinci bölümünü unutmayın: ve çalışma zamanında kendi yapısını ve davranışını değiştirin. Sonuçta bu cevabı aştım (ikinci yorumuma bakın), ancak OP'den gelen sorunun nereden geldiğini anlıyorum. ; p
Steven Jeuris

1
Bu yansıma tanımına göre, normal polimorfizm aynı zamanda bir tür yansıma olmaz mıydı?
Bjarke Freund-Hansen

4
@bjarkef: Polimorfizm tarafından kullanılan sanal gönderim, özelliklerini tanımlamak için söz konusu nesneyi açıkça inceleyen uygulama kodundan ziyade dilin kendisi tarafından dolaylı olarak yapıldığı için "hayır" derdim.
Dave Sherohman

2
@Dave Sherohman: Ayrıca işin çoğunun (atlama tabloları ayarlayarak, vb.) Çalışma zamanında değil derleme zamanında yapıldığını eklerdim.
TMN

13

Netlik adına iki cevabı düşünürdüm.

Teorik olarak , instanceofaçıklandığı gibi, yansıma şeklidir Falcon cevap .

Bilgisayar bilimlerinde yansıma, bir bilgisayar programının gözlemleyebildiği (inceleme türü yapabileceği) ve çalışma zamanında kendi yapısını ve davranışını değiştirebildiği süreçtir.

Bununla birlikte, pratikte , bir programcı yansıma kullanmaktan bahsettiğinde, genellikle bir değişkenin belirli bir tür olup olmadığını kontrol etmekten çok daha fazlasını ifade eder. Bu, bu tür ilkel bir kavramdır ve bunlar olmadan polimorfizm mümkün olmaz .

instanceofSık kullanmanın kod kokusunu gösterdiğini ve bunun yerine uygun polimorfizmin kullanılabileceğini unutmayın.


1
Potansiyel kod kokusu için +1 - her zaman değil, sadece potansiyel
Gary Rowe


2

Diğer cevaplardan bu yana, Vikipedi'deki tanım değiştirildi (bu değişikliğe katılıyorum ama bunu yapan ben değildim) parantez içindeki parçayı çıkarmak için:

Bilgisayar bilimlerinde yansıma, bir bilgisayar programının çalışma sırasındaki kendi yapısını ve davranışını inceleme, inceleme ve değiştirme yeteneğidir.

https://en.wikipedia.org/wiki/Type_introspection ayrıca özellikle diyor ki

İç gözlem, yansıma ile karıştırılmamalıdır

Ben düşünün olmaz instanceofprogramı bir değer değil, kendi yapısı inceler ve (Java: Program yapısını temsil eden herhangi bir değer içermez: İlk tanım kapsamına girmesi java.lang.Class, java.reflect.Methodvs.); yansıma damgası bu değerlerle çalışmaktadır.


-5

EVET, "instanceof" operatörünün bir yansıma şeklidir. Önceki cevaplar size nedenini söyler.

"Yansıma" veya "nesne / sınıf içgörüsü" bugünlerde bir yutturmacadır, ancak birkaç programlama dili bir süredir bu kavramın bazılarını kullanmıştır.

DOT NET (Java klonu), (mis) çok kullanır.


1
Uuuuhm,… dostum?
Konrad Rudolph

3
İlk cümleniz doğru ve önceki cevaplar karşısında gereksiz. Gerisi sadece yanlış.
Frank Shearar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.