2009-02-13 23 views
6

क्या जावा में शाखा या कूद तालिका के समान कुछ है?क्या जावा में शाखा/कूद तालिका जैसी कोई चीज है?

एक शाखा या कूद तालिका तालिका, है according to wikipedia,

एक कार्यक्रम के दूसरे भाग के लिए कार्यक्रम नियंत्रण (शाखाओं) को स्थानांतरित करने के लिए एक कुशल विधि (या एक अलग कार्यक्रम हो सकता है कि वर्णन करने के लिए शब्द का प्रयोग किया गतिशील रूप से लोड) शाखा निर्देशों की एक तालिका का उपयोग कर।

क्या जावा के पास ऐसा कुछ है या क्या मुझे बस/और अगर केस स्टेटमेंट का उपयोग करना है तो क्या करना है?

उत्तर

12

जावा में switch statement है, लेकिन चाहे यह बाइटकोड में एक कूद तालिका में संकलित हो, कार्यान्वयन-निर्भर है। आम तौर पर, यदि आपके स्विच स्टेटमेंट में प्रत्येक मामले के लिए अच्छे स्थिरांक मिलते हैं तो कंपाइलर्स आपको एक जंप टेबल बनाएंगे। मुझे यकीन नहीं है कि आपको वास्तव में देखभाल करना चाहिए कि यह कैसे कार्यान्वित किया गया है। यदि आप पहली बार जावा में कोडिंग कर रहे हैं, तो शायद आप बस कंपाइलर को देने के लिए ठीक हैं और जेआईटी आपके लिए इन चीजों का ख्याल रखता है।

ध्यान दें कि केवल स्विच, पूर्णांक आदिम प्रकार और enums के साथ काम करता है ताकि आप अगर/किसी और बयानों का उपयोग करने के जरूरत करना आप अन्य वस्तु प्रकार उपयोग कर रहे हैं (और आप शायद की तुलना युगल नहीं होना चाहिए या समानता के लिए तैरता वैसे भी)।

अंत में, भले ही enum संदर्भ तकनीकी रूप से "निरंतर" हैं, कुछ compilers केवल आप एक कूद तालिका उत्पन्न होगा जब आप enums पर स्विच करता है, तो अपने स्विच बयान एक ही संकलन इकाई जहां enum परिभाषित किया गया है में है। अन्यथा, यह आपको एक/अन्य श्रृंखला उत्पन्न करेगा (जैसा कि आपको नियमित वस्तुओं के लिए करना होगा)। Nitty gritty विवरण के लिए, java.net forums on extending switch usage for Objects देखें।

1

मुझे विश्वास नहीं है कि आपको जावा में ऐसे प्रदर्शन हैक्स की आवश्यकता है। मैं पठनीय कोड लिखने और सभ्य एल्गोरिदम का उपयोग करने पर ध्यान केंद्रित करूंगा - इससे आप जो चर्चा कर रहे हैं उससे अधिक प्रदर्शन लाभ प्रदान करेंगे।

अधिकांश स्टैंडअलोन अनुप्रयोगों में, अधिकांश समय उपयोगकर्ता को कुछ करने के लिए प्रतीक्षा करने के लिए बैठे समय में बिताया जाता है। अधिकांश वेब अनुप्रयोगों में, JVM में बाइटकोड चलाने वाले समय की मात्रा नेटवर्क समय, डेटाबेस समय या व्यावसायिक तर्क द्वारा मुद्रित की जानी चाहिए।

यदि आप वास्तव में अपने जावा ऐप के हिस्से के प्रदर्शन के बारे में चिंतित हैं, तो आप इसे जेएनआई कोड में ले जा सकते हैं और जावा दुभाषिया को पूरी तरह से बाईपास कर सकते हैं।

0

I सोचें कि कुछ स्विच स्टेटमेंट "हुड के तहत" कैसे लागू किए जाते हैं।

इसके अलावा, आप HashMap<whatever, Method> जैसे कुछ ऐसा कर सकते हैं, जहां आप map.get(something).invoke() का उपयोग करते हैं। लेकिन उस तरह के उद्देश्य को हराया जाता है क्योंकि यह एक जंप टेबल जितना तेज़ नहीं होगा, और मैं एक अच्छे मामले के बारे में नहीं सोच सकता जहां ओओपी प्रोग्रामिंग/पॉलिमॉर्फिज्म नौकरी बेहतर और क्लीनर नहीं करेगा।

-1

आप प्रतिबिंब और जेनेरिक हैश मैप के साथ ऐसा कर सकते हैं जो अनाम आंतरिक कक्षाओं को संग्रहीत करता है लेकिन यह एक भयानक हैक होगा।

देशी अज्ञात तरीकों के कारण सी # में करना वास्तव में सुरुचिपूर्ण है, लेकिन जावा में नहीं।

0

इस प्रकार की शाखा/जंप टेबल जो आप बात कर रहे हैं, सीधे जावा, सी इत्यादि जैसी उच्च स्तरीय भाषाओं द्वारा प्रदान नहीं की जाती हैं, लेकिन मशीन कोड या बाइट कोड में कंपाइलर्स द्वारा उत्पन्न की जाती हैं। दूसरे शब्दों में, आपका कंपाइलर उनका उपयोग कर सकता है लेकिन आप उन्हें नहीं देख सकते हैं।

4

क्या जावा में ऐसा कुछ है या क्या मुझे बस/और अगर केस स्टेटमेंट का उपयोग करना है तो क्या करना है?

मुझे लगता है कि केस स्टेटमेंट (जावा में स्विच के साथ) बराबर है।

इसके अतिरिक्त ओओपी में स्विच को एक बार कोड किया जा सकता है और फिर पॉलिमॉर्फिज्म को नौकरी में जाने दें।

से: http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html

alt text

यह अपनी आवश्यकताओं पर निर्भर करता है।

+0

इस पर +1 और keyersoze,/-1 हर किसी को ईएलएसई यह समझने के लिए कि ओओपी एक प्रेषण तालिका का कार्यान्वयन नहीं है! यह पूछने की तरह है कि सी को सीधे स्टैक में हेरफेर करने के लिए पुश कमांड क्यों नहीं है। –

+0

+1: जब तक कुछ _very_ असामान्य बाधा नहीं होती है, या समाधान एक-ऑफ और बहुत अनौपचारिक/छोटा होता है, वर्चुअल प्रेषण पसंदीदा प्रेषण तंत्र होना चाहिए। –

+0

पॉलिमॉर्फिज्म के साथ सशर्तों के प्रतिस्थापन को देखने के लिए एक और महान Google टेकटाक (जो मार्टिन फाउलर की पुस्तक - 'रिफैक्टरिंग: मौजूदा कोड के डिजाइन में सुधार' में एक रिफैक्टरिंग पैटर्न है) http://www.youtube.com/ घड़ी? वी = 4 एफ 72VULWFvc – Dinuk

3

एक कार्यक्रम के दूसरे भाग के लिए कार्यक्रम नियंत्रण (शाखाओं) को स्थानांतरित करने के लिए एक कुशल विधि (या एक अलग कार्यक्रम है कि गतिशील रूप से लोड किया जा सकता है) शाखा निर्देशों का एक तालिका का उपयोग कर का वर्णन शब्द का इस्तेमाल किया। "

प्रोग्राम नियंत्रण को स्थानांतरित करने का एक तरीका एक फ़ंक्शन को कॉल करना है। जब आपके पास से चुनने के लिए कई सही फ़ंक्शन को कॉल करने का एक तरीका है, तो इसे किसी ऑब्जेक्ट के प्रकार से बंद करना है। इसे पॉलिमॉर्फिज्म कहा जाता है। जावा और अन्य ऑब्जेक्ट ओरिएंटेड भाषाओं में पॉलिमॉर्फिज्म होता है, जो विरासत (सबक्लासिंग) के माध्यम से लागू होता है। सुनिश्चित नहीं है कि यह जावा में कैसे कार्यान्वित किया गया है, लेकिन सी ++ में प्रत्येक ऑब्जेक्ट में पॉइंटर होता है (आमतौर पर? या हमेशा?) टीएस के लिए वी-टेबल में टीएस, जिसमें वर्चुअल फ़ंक्शंस के पॉइंटर्स शामिल हैं।

मुझे गंभीरता से संदेह है कि उपयोगकर्ता द्वारा परिभाषित कूद तालिका की कमी आपके जावा एप्लिकेशन के प्रदर्शन को अपंग करने जा रही है।

+0

सही जवाब। इच्छा है कि मैं +3 कर सकता था –

0

आप ऐसा करने के लिए enum का उपयोग कर सकते हैं।

// doesn't work in c# 
enum Switch implements Runnable { 
    OPTION1() { 
    public void run() { 
     // do something. 
    } 
    }, 
    OPTION2() { 
    public void run() { 
     // do something. 
    } 
    }, 
    OPTION3() { 
    public void run() { 
     // do something. 
    } 
    } 
} 

Switch option = Switch.valueOf(switchOptionTest); 
option .run(); 
//or 
Switch[] options = Switch.values(); 
Switch option = options[nSwitchOption]; 
option .run(); 
1

हाँ, बिल्कुल।

यदि आप एक स्विच स्टेटमेंट कोड करते हैं, तो विभिन्न चीजों के आधार पर स्विच बाइटकोड में एक टेबलविच निर्देश में परिवर्तित हो जाता है। आम तौर पर

  • स्विच एक पूर्णांक मूल्य
  • उच्चतम पूर्णांक मूल्य और सबसे कम पूर्णांक मूल्य पर निर्भर में अंतराल नहीं होना चाहिए

इस हासिल करने के लिए सबसे आसान तरीका जावा enums उपयोग करने के लिए है , जो विशेष रूप से संकलक द्वारा संभाला जाता है। प्रासंगिक दस्तावेज Java Virtual Machine Specification में है। बेशक, जेआईटी कंपाइलर लगभग निश्चित रूप से इन प्लेटफार्मों के मशीन कोड में इन्हें सीधे तेज़ स्विच में परिवर्तित कर देता है।

कहा जाता है कि, वास्तविक आपके प्रश्न का उत्तर है "यह ऐसी चीज है जिसे आप मशीन कोड कर रहे हैं, उच्च स्तर की भाषा में प्रोग्रामिंग नहीं करते हैं" के बारे में चिंता करते हैं।

संबंधित मुद्दे