Là toán tử thể hiện Java được coi là sự phản chiếu và điều gì định nghĩa sự phản chiếu?


24

Tôi đã có một cuộc thảo luận với đồng nghiệp ngày hôm nay, liệu việc sử dụng toán tử Java instanceofcó phải là một loại phản ánh hay không. Và cuộc thảo luận nhanh chóng phát triển thành những gì thực sự định nghĩa sự phản ánh.

Vậy, định nghĩa của sự phản ánh là gì?

Và việc sử dụng instanceofđược coi là "sử dụng sự phản chiếu"?

Và ngoài ra, nếu instanceofđược coi là sự phản chiếu, thì đa hình cũng không phải là "sử dụng sự phản chiếu"? Nếu không, sự khác biệt là gì?


4
Bạn đã trả lời khá nhiều câu hỏi của riêng bạn. Cách bạn xác định 'sự phản chiếu' xác định xem có phải instanceoflà một ví dụ về sự phản chiếu hay không. Chắc chắn đó là một nơi nào đó giữa sử dụng dữ liệu thông thường và sử dụng siêu dữ liệu thông qua getClass()& bạn bè, nhưng bạn có thể có các định nghĩa hoàn toàn khả thi.
Kilian Foth

Là việc sử dụng returnđược coi là "lập trình cấu trúc"?
SF.

Câu trả lời:


22

Đây là định nghĩa của sự phản ánh theo wikipedia:

Trong khoa học máy tính, sự phản chiếu là quá trình mà một chương trình máy tính có thể quan sát (thực hiện nội quan kiểu) và sửa đổi cấu trúc và hành vi của chính nó khi chạy.

Tôi không thể nói điều đó tốt hơn bản thân mình và nhấn mạnh phần quan trọng cho câu hỏi của bạn. Điều đó nói rằng, có, instanceofđược xem xét sử dụng sự phản ánh. Chương trình quan sát cấu trúc của nó và tiến hành hướng nội loại .


3
@Steven Jeuris: Sự khác biệt là if (true)nhìn vào một giá trị , không phải ở một loại . Đó là lý do tại sao nó không được coi là sự phản ánh.
sleske

1
@sleske: Lý do tại sao tôi đề cập đến nó là bởi vì quan sát một loại là một nguyên tắc thô sơ như vậy. Không có nó sẽ không có đa hình. Về mặt kỹ thuật, điều này có nghĩa là ghi đè đơn giản cũng có thể được coi là sự phản chiếu (hoặc ít nhất là kết quả trong). Đừng quên phần thứ hai của định nghĩa: và sửa đổi cấu trúc và hành vi của chính nó khi chạy. Tất cả trong tất cả tôi đã nêu lên câu trả lời này (kiểm tra bình luận thứ hai của tôi), nhưng tôi hiểu câu hỏi từ OP đến từ đâu. ; p
Steven Jeuris

1
Theo định nghĩa của sự phản chiếu, liệu đa hình bình thường cũng không phải là một loại phản xạ?
Bjarke Freund-Hansen

4
@bjarkef: Tôi sẽ nói "không", vì công văn ảo được sử dụng bởi đa hình được thực hiện hoàn toàn bởi chính ngôn ngữ, thay vì mã ứng dụng kiểm tra rõ ràng đối tượng trong câu hỏi để xác định các đặc điểm của nó.
Dave Sherohman

2
@Dave Sherohman: Tôi cũng nói thêm rằng hầu hết các công việc (thiết lập bảng nhảy, v.v.) được thực hiện vào thời gian biên dịch, không phải thời gian chạy.
TMN

13

Để rõ ràng, tôi sẽ xem xét hai câu trả lời.

Về mặt lý thuyết , instanceoflà một hình thức phản ánh, như được giải thích trong câu trả lời của Falcon .

Trong khoa học máy tính, sự phản chiếu là quá trình mà một chương trình máy tính có thể quan sát (thực hiện nội quan kiểu) và sửa đổi cấu trúc và hành vi của chính nó khi chạy.

Tuy nhiên, trên thực tế , khi một lập trình viên nói về việc sử dụng sự phản chiếu, anh ta thường đề cập nhiều hơn là chỉ kiểm tra xem một biến có thuộc một loại nhất định hay không. Đây là một khái niệm thô sơ như vậy, nếu không có nó, đa hình sẽ không thể thực hiện được .

Xin lưu ý rằng việc sử dụng instanceofthường chỉ ra mùi mã và đa hình thích hợp thường có thể được sử dụng thay thế.


1
+1 cho mùi mã tiềm năng - không phải lúc nào cũng vậy, chỉ là tiềm năng
Gary Rowe


2

Vì các câu trả lời khác, định nghĩa trong Wikipedia đã được thay đổi (tôi tình cờ đồng ý với thay đổi này, nhưng tôi không phải là người đưa ra) để xóa phần trong ngoặc đơn:

Trong khoa học máy tính, sự phản chiếu là khả năng của một chương trình máy tính kiểm tra, hướng nội và sửa đổi cấu trúc và hành vi của chính nó khi chạy.

https://en.wikipedia.org/wiki/Type_introspection cũng nói cụ thể

Nội tâm không nên nhầm lẫn với sự phản ánh

Tôi sẽ không xem xét instanceofđến thuộc định nghĩa thứ nhất: chương trình kiểm tra một giá trị, không cấu trúc riêng của nó, và nó không liên quan đến bất kỳ giá trị đại diện cho cấu trúc chương trình (trong Java: java.lang.Class, java.reflect.Method, vv); dấu hiệu của sự phản chiếu là làm việc với các giá trị như vậy.


-5

CÓ, "instanceof" vận hành nó như một hình thức phản chiếu. Các câu trả lời trước cho bạn biết lý do tại sao.

"Reflection" hoặc "introspection" là một sự cường điệu ngày nay, nhưng một số ngôn ngữ lập trình đã sử dụng một số khái niệm đó, đôi khi.

DOT NET (bản sao Java), (mis) sử dụng rất nhiều.


1
Uuuuhm, đào anh chàng?
Konrad Rudolph

3
Câu đầu tiên của bạn là chính xác, và dư thừa khi đối mặt với các câu trả lời trước đó. Phần còn lại chỉ là sai.
Frank Shearar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.