그들은 바이트 코드에서 필요한 지침을 구현하지 않았고 당신 때문에 정말 많은 경우, "제작 준비"코드가 얼마나 상관없이 쓰고 싶지 않아 ...
[편집 :이 답변에 대한 의견에서 추출, 배경에 대한 추가 사항 포함]
정확히 말하면, 2³²는 많은 경우이며 그 이상을 저장할 수있는 방법을 가진 프로그램은 완전히 끔찍할 것입니다! 모든 언어로. (어떤 언어의 어떤 코드에서든 내가 아는 가장 긴 함수는 6k SLOC를 약간 넘는 것입니다. 예, 그것은 크며 switch
정말 관리하기 어렵습니다.) 만약 당신이 하나 이하 long
만 가져야 하는 곳에 집착한다면 int
, 두 가지 실제 대안이 있습니다.
해시 함수 테마에 대한 몇 가지 변형을 사용 long
하여 int
. 가장 간단한 방법은 유형이 잘못되었을 때만 사용하는 것입니다. 더 유용한 방법은 다음과 같습니다.
(int) ((x&0xFFFFFFFF) ^ ((x >>> 32) & 0xFFFFFFFF))
결과를 켜기 전에. 테스트 대상 케이스를 변환하는 방법도 알아 내야합니다. 그러나 실제로는 많은 경우의 실제 문제를 다루지 않기 때문에 여전히 끔찍합니다.
매우 많은 수의 케이스로 작업하는 경우 훨씬 더 나은 솔루션 Map<Long,Runnable>
은 특정 값을 전달하는 방법을 찾을 수 있도록 a 또는 유사한 것을 사용하도록 설계를 변경하는 것입니다. 이를 통해 케이스를 여러 파일로 분리 할 수 있습니다. 이는 케이스 수가 커지면 관리하기가 훨씬 더 쉽습니다.하지만 관련된 구현 클래스의 호스트 등록을 구성하는 것이 더 복잡해집니다 (주석은 다음을 허용함으로써 도움이 될 수 있습니다. 자동으로 등록 코드 작성).
FWIW, 저는 수년 전에 대규모 병렬 하드웨어를 시뮬레이션하기위한 커스텀 바이트 코드 엔진을 구축 할 때 (프로젝트를 통해 새로 출시 된 J2SE 1.2로 전환했습니다)이 작업을 수행했습니다 (아니요, JVM 재사용은 근본적으로 다른 값과 실행 모델이 포함되어 있음) switch
C 버전의 코드가 사용 하는 큰 코드에 비해 코드가 엄청나게 단순화 되었습니다.
하고 싶은, 테이크 가정 메시지를 반복하려면 switch
A가에 long
하나 당신이 당신의 프로그램 또는 당신이 클래스를 사용하는 것을 포함하는 많은 변화가있는 시스템을 구축하고 그 유형이 잘못 가지고 있다는 표시입니다. 두 경우 모두 재고 할 시간입니다.