Kotlin में Companion object: Java static का विकल्प और प्रदर्शन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin में static क्यों नहीं है, लेकिन companion object क्यों है? प्रदर्शन और तर्क को समझें

\n\n

यदि आप Java से Kotlin पर आ रहे हैं, तो पहले प्रश्नों में से एक जो StackOverflow पर आपके मन में उठेगा (और वास्तव में इसने हज़ारों बार देखा गया है), वह यह है: «हम Java static के बजाय companion object का उपयोग क्यों करते हैं? और क्या यह एप्लिकेशन को धीमा नहीं करता?»

\n\n

आइए ईमानदार रहें: जब मैंने पहली बार companion object कंस्ट्रक्शन देखा, तो मुझे लगा कि Kotlin टीम ने जीवन को जटिल बनाने का फैसला किया है। अधिक कोड क्यों लिखें, जबकि Java से static को कॉपी किया जा सकता था? लेकिन गहराई से खोजबीन करने पर, मैंने समझा: यह कोई सनक नहीं, बल्कि एक सुविचारित आर्किटेक्चरल निर्णय है, जो कोड को साफ, सुरक्षित और… हाँ, कभी-कभी तेज़ भी बनाता है।

\n\n

इस लेख में हम केवल SO से उत्तर का अनुवाद नहीं करेंगे। हम यह समझेंगे कि companion object हुड के नीचे कैसे काम करता है, Java static के साथ प्रदर्शन की तुलना करेंगे, और दिखाएंगे कि इसका उपयोग कब करना है और कब कोई दूसरा रास्ता चुनना बेहतर है।

\n\n

सरल शब्दों में companion object क्या है?

\n\n

Java में स्थैतिक फ़ील्ड और विधियाँ क्लास से संबंधित होती हैं, न कि इंस्टेंस से। Kotlin ने static कीवर्ड से दूर जाने का फैसला किया, क्योंकि यह OOP सिद्धांतों का उल्लंघन करता है (static को ओवरराइड नहीं किया जा सकता, यह ऑब्जेक्ट का हिस्सा नहीं है)। इसके बजाय, Kotlin ऑब्जेक्ट-कम्पैनियन प्रदान करता है।

\n\n

कल्पना करें कि आपके पास एक क्लास User है। आप एक कॉन्स्टेंट MAX_AGE और एक फ़ैक्टरी विधि createGuest() संग्रहीत करना चाहते हैं। Java में आप लिखेंगे:

\n\n
public class User {\n    public static final int MAX_AGE = 120;\n    public static User createGuest() {\n        return new User("guest", "1234");\n    }\n}
\n\n

Kotlin में यह इस तरह दिखता है:

\n\n
class User(private val name: String, private val password: String) {\n    companion object {\n        const val MAX_AGE = 120\n        fun createGuest() = User("guest", "1234")\n    }\n}
\n\n

ध्यान दें: companion object केवल एक «static-ब्लॉक» नहीं है। यह एक पूर्ण ऑब्जेक्ट है, जो आपकी क्लास के अंदर रहता है। इसके इंटरफ़ेस, एक्सटेंशन और यहाँ तक कि अपना नाम भी हो सकता है (यदि आप इसे सेट करते हैं)।

\n\n

companion object हुड के नीचे कैसे काम करता है? (JVM की नज़र से)

\n\n

प्रदर्शन को समझने के लिए, आइए बाइटकोड में झाँकें। जब आप companion object लिखते हैं, तो Kotlin कंपाइलर निम्नलिखित करता है:

\n\n
    \n
  • Companion (या आपके कस्टम नाम) नामक एक आंतरिक स्थैतिक क्लास बनाता है।
  • \n
  • companion object के सभी फ़ील्ड और विधियों को इस क्लास में रखता है।
  • \n
  • यदि आप @JvmStatic एनोटेशन का उपयोग करते हैं, तो कंपाइलर क्लास में अतिरिक्त स्थैतिक रैपर विधियाँ उत्पन्न करता है।
  • \n
\n\n

@JvmStatic एनोटेशन के साथ उदाहरण:

\n\n
class User {\n    companion object {\n        @JvmStatic\n        fun createGuest() = User()\n    }\n}
\n\n

अब Java से आप User.createGuest() को एक सामान्य स्थैतिक विधि की तरह कॉल कर सकते हैं। इस एनोटेशन के बिना, आपको User.Companion.createGuest() लिखना होगा।

\n\n

प्रदर्शन के लिए निष्कर्ष: यदि आप केवल Kotlin के साथ काम करते हैं, तो कोई अतिरिक्त ओवरहेड नहीं है। यदि Java से कॉल करते हैं, तो एक अतिरिक्त अप्रत्यक्ष स्तर (Companion ऑब्जेक्ट के माध्यम से) है। लेकिन JVM का JIT कंपाइलर ऐसे कॉल को अच्छी तरह से इनलाइन करता है, इसलिए गति में अंतर लगभग शून्य है।

\n\n

प्रदर्शन: companion object बनाम Java static

\n\n

आइए मुख्य मिथक को दूर करें: companion object धीमा नहीं है। मैंने कई माइक्रो-बेंचमार्क (Kotlin 1.9, JVM 17 पर) चलाए, और यहाँ परिणाम हैं:

\n\n\n \n \n \n

ब्लॉग

पुस्तक अनुशंसाएँ

परिदृश्यJava static