Có ai biết tại sao Java không cho phép bạn chuyển đổi số lớn hơn số nguyên không? Có lý do kỹ thuật nào đằng sau điều này không?Java và trường hợp chuyển đổi
Trả lời
Có thể vì chương trình thực sự kém để có nhiều hơn số nguyên tối đa trong một chuyển đổi?
Nếu bạn muốn chuyển qua các biến dài, chỉ cần projet chúng trong không gian interger.
Như đã nói here, chuyển đổi hoạt động với các loại dữ liệu nguyên gốc byte, ngắn, char và int. Nó cũng làm việc với các kiểu liệt kê và một vài lớp đặc biệt mà "bọc" các kiểu nguyên thủy nhất định: Ký tự, Byte, Ngắn và Integer.
Câu lệnh chuyển đổi Java được biên dịch thành JVM bytecode tableswitch or lookupswitch. Cả hai bytecode này yêu cầu các giá trị của trường hợp là các hằng số biên dịch độc nhất, 32 bit, số nguyên.
Hướng dẫn sử dụng bảng và hướng dẫn tra cứu đều bao gồm một nhánh bù mặc định và một tập hợp các cặp giá trị trường hợp/chi nhánh có độ dài thay đổi.
Cả hai hướng dẫn bật phím (giá trị của biểu thức trong dấu ngoặc đơn ngay sau từ khóa chuyển đổi) từ ngăn xếp.
Điều quan trọng là so với tất cả các giá trị trường hợp:
- Nếu một trận đấu được tìm thấy, các chi nhánh bù đắp gắn liền với giá trị trường hợp được lấy.
- Nếu không tìm thấy kết quả phù hợp, bù trừ nhánh mặc định sẽ được thực hiện.
Mặc dù đại diện cho trên chi tiết thực hiện, tôi tin rằng các loại sử dụng cho switch là người phù hợp với một bytecode hiệu quả cho các dòng điều khiển, và nó có thể là một phần quan trọng cho lý do của sự lựa chọn này.
Như đã nói trong này Java Bug:
Tôi cho rằng bạn có thể cho phép các trường hợp tuyên bố Java chuyển sang bao gồm các loại khác của các giá trị, và biên dịch một câu lệnh switch có sử dụng một trong những loại giá trị vào bytecode khác, chẳng hạn như một chuỗi các ifs và gotos. Nhưng sau đó chúng ta sẽ phải kiểm tra tất cả các câu lệnh switch cẩn thận để xác định xem nó sẽ được biên dịch thành một bytecode chuyển đổi nhanh hay một chuỗi các if-elses chậm.
Như đã nói trong
'chuyển đổi' này Java bug khác tuyên bố có thể sử dụng chức năng bàn văn và/hoặc tìm kiếm nhị phân-cây để phù hợp với những điều khoản về trường hợp nhanh hơn chỉ là thử nghiệm từng cái một theo thứ tự .
Đây là chi tiết triển khai. Không phải là lý do thực sự của sự lựa chọn này. – Gilles
Dự đoán của tôi là từ lâu đã bị loại dưới dạng loại biểu thức chuyển đổi hợp lệ vì/liên quan đến thực tế là hoạt động trên các biến dài may not be atomic.
Tôi không nghĩ đó là lý do. Nếu đó là trường hợp thì nếu khác cũng nên đã bị hạn chế phải không? Tôi nghĩ rằng nó đã làm một cái gì đó với các chế độ địa chỉ của một bộ xử lý như VonC chỉ ra (Bởi vì chuyển đổi không được biên dịch vào cùng một mã byte như nếu cấu trúc khác). – Abhi
Scala, một ngôn ngữ được xây dựng trên đầu trang của JVM, cho phép bạn xác định các trường hợp của riêng bạn, mà bạn có thể sử dụng trong một tuyên bố chuyển đổi. Vì vậy, sử dụng longs hoặc double hoặc Strings trong một tuyên bố chuyển đổi chắc chắn là có thể.
Tôi không biết làm thế nào phức tạp và hiệu quả như thế nào. Với các kiểu đơn giản, trình biên dịch chỉ tính toán bù đắp để nhảy trên một bảng.Điều này chắc chắn không phải là trường hợp với các loại phức tạp hơn.
Tôi cho rằng câu trả lời có liên quan đến thời gian java được thiết kế và mục tiêu mà các nhà thiết kế đang cố gắng đạt được. Mục tiêu ban đầu của Java là thiết kế một "C++ tốt hơn", di động trong nhiều môi trường. Tôi có thể hiểu tại sao một chuyển đổi trên các loại phức tạp không phù hợp với nó.
Nếu bạn tìm thấy cấu trúc chuyển đổi java gốc quá giới hạn, hãy xem nhanh lambdaj Switcher cho phép chuyển đổi bất kỳ đối tượng bất kỳ bằng cách kết hợp chúng với một số người hamcrest matchers.
- 1. Chuyển đổi trường hợp kết hợp chuỗi regex và số
- 2. Java Enums và báo cáo chuyển đổi - trường hợp mặc định?
- 3. trường hợp chuyển đổi vs nếu khác
- 4. Chuyển đổi trường hợp với fallthrough?
- 5. Sự cố chuyển đổi Java: biểu thức trường hợp phải là biểu thức không đổi
- 6. Thực tiễn không tốt trong trường hợp chuyển đổi có phải là trường hợp chuyển đổi không?
- 7. Tối ưu hóa câu lệnh chuyển đổi Java với nhiều trường hợp?
- 8. Java: Cách khởi tạo mảng int trong trường hợp chuyển đổi?
- 9. C# chuyển đổi: Trường hợp không thuộc thông qua đối với trường hợp khác giới hạn
- 10. Phương án thay thế cho trường hợp chuyển đổi trong Java
- 11. C: trường hợp chuyển đổi với toán tử logic
- 12. Trường hợp chuyển đổi mã mức lắp ráp
- 13. Sử dụng || trong trường hợp chuyển đổi trong Rails
- 14. tham chiếu enum trong trường hợp chuyển đổi
- 15. trường hợp chuyển đổi có biểu thức số nguyên
- 16. Enums, sử dụng trong trường hợp chuyển đổi
- 17. Trường hợp chuyển đổi C/C++ trên mảng char
- 18. Chuyển đổi/Trường hợp SQL trong mệnh đề
- 19. C# Chuỗi trường hợp chuyển đổi bắt đầu bằng
- 20. trường hợp chuyển đổi có thẻ hiển thị
- 21. Có trường hợp Chuyển đổi thông minh không?
- 22. Chuyển đổi, cùng một giá trị cho nhiều trường hợp
- 23. trường hợp mặc định trong một điều kiện chuyển đổi
- 24. Android: cách tạo trường hợp Chuyển đổi từ điều này?
- 25. Nhiều điều kiện trong trường hợp chuyển đổi?
- 26. JS trường hợp chuyển đổi không hoạt động
- 27. Byte và chuyển đổi char trong Java
- 28. Chỉ số mã Visual Studio và chỉ số bảo trì của trường hợp chuyển đổi
- 29. Cách sử dụng typeof và chuyển đổi các trường hợp trong Javascript
- 30. Chuyển đổi chuỗi thành tên biến Java hợp lệ
Vui lòng không bỏ phiếu cho câu trả lời này! Nó giải thích * tại sao * các nhà thiết kế ngôn ngữ Java nghĩ rằng nó là hợp lý để giới hạn câu lệnh switch thành các kiểu 32-bit. – palm3D
Đây không phải là một lý do, đó là đầu cơ. Chiếu dài vào không gian số nguyên cũng đánh bại mục đích sử dụng lâu dài. –
Đó sẽ là một lý do khá câm, hãy tưởng tượng có một số chuỗi dài bạn cần phải chuyển đổi. – MightyPork