Stringमामलों के साथ स्विच स्टेटमेंट जावा एसई 7 में लागू किए गए हैं , कम से कम 16 साल बाद वे पहले अनुरोध किए गए थे। देरी का स्पष्ट कारण प्रदान नहीं किया गया था, लेकिन इसकी संभावना प्रदर्शन के साथ थी।
जेडीके 7 में कार्यान्वयन
इस सुविधा को अब javac "डी-शुगरिंग" प्रक्रिया के साथ लागू किया गया है; एक स्वच्छ, उच्च-स्तरीय वाक्यविन्यास का उपयोग घोषणाओं Stringमें स्थिरांक को caseएक पैटर्न के बाद अधिक जटिल कोड में संकलन-समय पर किया जाता है। परिणामी कोड JVM निर्देशों का उपयोग करता है जो हमेशा मौजूद रहे हैं।
एक switchसाथ Stringमामलों संकलन के दौरान दो स्विच में अनुवाद किया है। पहला स्ट्रिंग प्रत्येक स्ट्रिंग को एक अद्वितीय पूर्णांक में देता है - मूल स्विच में इसकी स्थिति। यह पहले लेबल के हैश कोड पर स्विच करके किया जाता है। संबंधित मामला एक ifकथन है जो स्ट्रिंग समानता का परीक्षण करता है; यदि हैश पर टकराव होते हैं, तो परीक्षण एक कैस्केडिंग है if-else-if। दूसरा स्विच दर्पण को मूल स्रोत कोड में रखता है, लेकिन उनके अनुरूप पदों के साथ केस लेबल को प्रतिस्थापित करता है। यह दो-चरणीय प्रक्रिया मूल स्विच के प्रवाह नियंत्रण को संरक्षित करना आसान बनाती है।
जेवीएम में स्विच करता है
अधिक तकनीकी गहराई के लिए switch, आप जेवीएम विनिर्देश का उल्लेख कर सकते हैं, जहां स्विच स्टेटमेंट का संकलन वर्णित है। संक्षेप में, दो अलग-अलग जेवीएम निर्देश हैं जिनका उपयोग स्विच के लिए किया जा सकता है, जो मामलों द्वारा उपयोग किए जाने वाले स्थिरांक की निर्भरता पर निर्भर करता है। दोनों प्रत्येक मामले को कुशलतापूर्वक निष्पादित करने के लिए पूर्णांक स्थिरांक का उपयोग करने पर निर्भर करते हैं।
यदि स्थिरांक घने होते हैं, तो उन्हें एक निर्देशांक (सबसे कम मूल्य को घटाकर) के रूप में उपयोग किया जाता है, निर्देश बिंदुओं की तालिका में - tableswitchनिर्देश।
यदि स्थिरांक विरल हैं, तो सही मामले के लिए एक द्विआधारी खोज- lookupswitchनिर्देश दिया जाता है।
वस्तुओं switchपर डी-शुगरिंग में String, दोनों निर्देशों का उपयोग किए जाने की संभावना है। lookupswitchहैश कोड पर पहले स्विच मामले की मूल स्थिति को खोजने के लिए के लिए उपयुक्त है। परिणामी क्रमिक एक के लिए एक प्राकृतिक फिट है tableswitch।
दोनों निर्देशों के लिए प्रत्येक मामले को सौंपे गए पूर्णांक स्थिरांक को संकलन समय पर हल करने की आवश्यकता होती है। रनटाइम के दौरान, आमतौर पर O(1)प्रदर्शन के प्रदर्शन से tableswitchबेहतर प्रतीत होता O(log(n))है lookupswitch, यह निर्धारित करने के लिए कुछ विश्लेषण की आवश्यकता होती है कि क्या अंतरिक्ष-समय के व्यापार को सही ठहराने के लिए तालिका पर्याप्त घनी है। बिल वीनर्स ने एक महान लेख लिखा जो इसे और अधिक विस्तार से कवर करता है, साथ ही अन्य जावा प्रवाह नियंत्रण निर्देशों पर एक अंडर-हुड नज़र के साथ।
जेडीके 7 से पहले
जेडीके 7 से पहले, enumएक- Stringआधारित स्विच का अनुमान लगा सकता है । यह संकलक द्वारा उत्पन्न हर प्रकार पर स्थिरvalueOf विधि का उपयोग करता हैenum । उदाहरण के लिए:
Pill p = Pill.valueOf(str);
switch(p) {
case RED: pop(); break;
case BLUE: push(); break;
}