2008-11-21 48 views

Trả lời

-7

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.

+0

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

+3

Đâ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. –

+0

Đó 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

23

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

+3

Đâ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

0

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.

+0

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

1

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

0

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.

Các vấn đề liên quan