Apakah Java instanceof operator dianggap refleksi, dan apa yang mendefinisikan refleksi?


24

Saya berdiskusi dengan seorang rekan kerja hari ini, apakah penggunaan menggunakan operator Java instanceofadalah semacam refleksi. Dan diskusi dengan cepat berkembang menjadi apa yang sebenarnya mendefinisikan refleksi.

Jadi, apa definisi refleksi?

Dan apakah penggunaan instanceofdianggap "menggunakan refleksi"?

Dan selain itu, jika instanceofdianggap sebagai refleksi, maka apakah polimorfisme tidak juga "menggunakan refleksi"? Jika tidak, apa bedanya?


4
Anda sudah cukup banyak menjawab pertanyaan Anda sendiri. Bagaimana Anda mendefinisikan 'refleksi' menentukan apakah instanceofmerupakan contoh refleksi. Tentu saja itu adalah suatu tempat antara penggunaan data normal dan penggunaan metadata via getClass()& teman-teman, tetapi Anda dapat memiliki definisi yang bisa diterapkan dengan cara melayu.
Kilian Foth

Apakah penggunaan return"pemrograman struktural" dianggap?
SF.

Jawaban:


22

Ini adalah definisi refleksi menurut wikipedia:

Dalam ilmu komputer, refleksi adalah proses dimana sebuah program komputer dapat mengamati (melakukan ketik introspeksi) dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

Saya sendiri tidak bisa mengatakannya dengan lebih baik dan menyoroti bagian penting untuk pertanyaan Anda. Yang mengatakan, ya, instanceofdianggap menggunakan refleksi. Program mengamati strukturnya dan melakukan introspeksi jenis .


3
@ Seven Jeuris: Perbedaannya adalah yang if (true)terlihat pada nilai , bukan pada tipe . Itu sebabnya itu tidak dianggap refleksi.
sleske

1
@sleske: Alasan mengapa saya menyebutkan itu karena mengamati tipe adalah prinsip yang belum sempurna. Tanpanya tidak akan ada polimorfisme. Secara teknis ini berarti penimpaan sederhana juga dapat dianggap sebagai refleksi (atau setidaknya menghasilkan). Jangan lupa bagian kedua dari definisi: dan modifikasi struktur dan perilakunya sendiri saat runtime. Secara keseluruhan saya memutakhirkan jawaban ini (periksa komentar kedua saya), tapi saya mengerti dari mana pertanyaan dari OP itu berasal. ; p
Steven Jeuris

1
Menurut definisi refleksi itu, akankah polimorfisme normal tidak juga menjadi semacam refleksi?
Bjarke Freund-Hansen

4
@ bjarkef: Saya akan mengatakan "tidak", karena pengiriman virtual yang digunakan oleh polimorfisme dilakukan secara implisit oleh bahasa itu sendiri, daripada kode aplikasi secara eksplisit memeriksa objek yang dimaksud untuk mengidentifikasi karakteristiknya.
Dave Sherohman

2
@ Dave Sherohman: Saya juga menambahkan bahwa sebagian besar pekerjaan (mengatur tabel lompatan, dll) dilakukan pada waktu kompilasi, bukan waktu berjalan.
TMN

13

Demi kejelasan, saya akan mempertimbangkan dua jawaban.

Secara teoritis , instanceofadalah bentuk refleksi, seperti yang dijelaskan dalam jawaban Falcon .

Dalam ilmu komputer, refleksi adalah proses dimana sebuah program komputer dapat mengamati (melakukan ketik introspeksi) dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

Namun, secara praktis , ketika seorang programmer berbicara tentang menggunakan refleksi ia biasanya merujuk lebih dari sekadar memeriksa apakah suatu variabel adalah tipe tertentu. Ini adalah konsep yang belum sempurna, yang tanpanya, polimorfisme tidak akan mungkin terjadi .

Perhatikan bahwa menggunakan instanceofsering menunjukkan bau kode, dan polimorfisme yang tepat sering dapat digunakan sebagai gantinya.


1
+1 untuk kemungkinan bau kode - tidak selalu, hanya potensi
Gary Rowe


2

Karena jawaban yang lain, definisi di Wikipedia telah diubah (Kebetulan saya setuju dengan perubahan ini, tetapi saya bukan orang yang membuatnya) untuk menghapus bagian dalam tanda kurung:

Dalam ilmu komputer, refleksi adalah kemampuan program komputer untuk memeriksa, mengintrospeksi, dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

https://en.wikipedia.org/wiki/Type_introspection juga secara khusus mengatakan

Introspeksi tidak harus disamakan dengan refleksi

Saya tidak akan mempertimbangkan instanceofuntuk jatuh di bawah definisi pertama: program meneliti nilai, bukan struktur sendiri, dan tidak melibatkan nilai-nilai yang mewakili struktur program (di Jawa: java.lang.Class, java.reflect.Method, dll); ciri refleksi bekerja dengan nilai-nilai seperti itu.


-5

YA, operator "instanceof" merupakan bentuk refleksi. Jawaban sebelumnya memberi tahu Anda alasannya.

"Refleksi" atau "introspeksi objek / kelas" adalah hype akhir-akhir ini, tetapi beberapa bahasa pemrograman telah menggunakan beberapa konsep itu, sejak beberapa waktu.

DOT NET (Java clone), (mis) banyak menggunakan.


1
Uuuuhm, ... kawan?
Konrad Rudolph

3
Kalimat pertama Anda benar, dan mubazir di hadapan jawaban sebelumnya. Sisanya salah.
Frank Shearar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.