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;
}