लोगों ने जो कहा है उसे जोड़ने के लिए एक अंतिम बात है।
static
विधि का उपयोग करने से इस तथ्य के कारण थोड़ा कम ओवरहेड होता है कि आपने बाध्यकारी समय संकलित करने की गारंटी दी है। स्टेटिक विधि कॉल बाइटकोड निर्देश invokestatic
बनाएगा। ]
एक सामान्य परिदृश्य में, इंस्टेंस विधियां रनटाइम पर बाध्य होती हैं, और बाइटकोड निर्देश invokevirtual
बनाएगी जो invokestatic
से अधिक ऊपरी है।
हालांकि, यह संभवतः लाखों पुनरावृत्तियों के मामले में प्रासंगिक हो जाता है, और मैं आपके वर्ग के डिजाइन को चलाने के खिलाफ सावधानी बरतता हूं। एक डिजाइन परिप्रेक्ष्य से क्या समझ में आता है। आपके विवरण के आधार पर, static
विधियों को शायद जाने का तरीका है। वास्तव में, यह उपयोगिता वर्ग बनाने के लिए अपेक्षाकृत मानक अभ्यास है:
public class MyUtilities {
private MyUtilities() { } // don't let anyone construct it.
public static String foo(String s) { ... }
}
कहानी कुछ और जटिल है क्योंकि 'invokevirtual' वास्तविक मशीन निर्देश नहीं है। सबसे बुरे मामले में इसे एक मोनोमोर्फिक कॉल साइट के रूप में लागू किया जाएगा, लेकिन यदि कक्षा अंतिम है (या निजी कन्स्ट्रक्टर के आधार पर प्रभावी रूप से अंतिम), तो यह एक हार्डवार्ड कॉल होगा। इसके बावजूद, रनटाइम ध्यान दे सकता है कि कोई सबक्लास नहीं है और वैसे भी कॉल को कड़ी मेहनत कर रहा है। –
हां, मैं समझता हूं कि यह गारंटी नहीं देता है कि यह कड़ी मेहनत नहीं है, लेकिन मैं स्पष्टीकरण को सरल रखने की कोशिश कर रहा था, क्योंकि ज्यादातर लोग जेवीएम के आंतरिक को समझ नहीं पाते हैं। – Matt
मुझे कहना होगा कि आपका शब्द भ्रामक है। यहां कोई "सामान्य परिदृश्य" नहीं है: उदाहरण विधि आमंत्रण ** हमेशा ** 'invokevirtual' के लिए संकलित करता है; इसी तरह स्थिर विधि और 'invokestatic' के साथ। –