परिचय
Java में `static` कीवर्ड क्लास-लेवल मेंबर्स (वेरिएबल्स/मेथड्स) के लिए उपयोग किया जाता है जो इंस्टेंस के बिना एक्सेसिबल होते हैं। Kotlin में `static` कीवर्ड नहीं है, लेकिन समान कार्यक्षमता के लिए दो मुख्य दृष्टिकोण प्रदान करता है।
दृष्टिकोण 1: Companion Object (अनुशंसित)
Kotlin में `companion object` क्लास से जुड़ा एक सिंगलटन ऑब्जेक्ट बनाता है, जो static मेंबर्स के बराबर कार्यक्षमता प्रदान करता है।
उदाहरण:
class MyClass {
companion object {
// "Static" वेरिएबल (val = अपरिवर्तनीय)
const val STATIC_FIELD = "यह एक स्थिर वेरिएबल है"
// "Static" मेथड
fun getStaticFunction(): String {
return "यह एक स्थिर मेथड है"
}
// परिवर्तनीय "static" वेरिएबल
var counter = 0
private set
fun incrementCounter() {
counter++
}
}
// इंस्टेंस मेथड companion के प्राइवेट मेंबर्स एक्सेस कर सकता है
fun printCounter() {
println("काउंटर: ${counter}")
}
}
fun main() {
// इंस्टेंस बनाए बिना एक्सेस
println(MyClass.STATIC_FIELD)
println(MyClass.getStaticFunction())
MyClass.incrementCounter()
MyClass.incrementCounter()
println("काउंटर: ${MyClass.counter}") // 2
// नोट: const val को पुनः असाइन नहीं किया जा सकता
// MyClass.STATIC_FIELD = "नया" // कंपाइल त्रुटि
// लेकिन var बदला जा सकता है
MyClass.counter = 10 // अगर setter public हो
}
आउटपुट
यह एक स्थिर वेरिएबल है यह एक स्थिर मेथड है काउंटर: 2
दृष्टिकोण 2: Object Declaration + @JvmStatic
जब Java इंटरऑपरेबिलिटी के लिए वास्तविक static मेंबर्स की आवश्यकता हो।
उदाहरण:
object MyStaticUtils {
@JvmStatic
val STATIC_FIELD = "यह एक स्थिर वेरिएबल है"
@JvmStatic
fun getStaticFunction(): String = "यह एक स्थिर मेथड है"
@JvmStatic
fun computeValue(input: Int): Int = input * 2
}
// Java से कॉल करने पर: MyStaticUtils.STATIC_FIELD, MyStaticUtils.getStaticFunction()
fun main() {
println(MyStaticUtils.STATIC_FIELD)
println(MyStaticUtils.getStaticFunction())
println("गणना: ${MyStaticUtils.computeValue(5)}")
}
आउटपुट
यह एक स्थिर वेरिएबल है यह एक स्थिर मेथड है गणना: 10
तुलना: Companion Object बनाम @JvmStatic
| पहलू | Companion Object | @JvmStatic पर Object |
|---|---|---|
| Kotlin से एक्सेस | `MyClass.field` | `MyObject.field` |
| Java से एक्सेस | `MyClass.Companion.getField()` या `@JvmField` के साथ | `MyObject.field` (वास्तविक static) |
| क्लास प्राइवेट मेंबर्स एक्सेस | हाँ | नहीं |
| इंटरफेस में उपयोग | नहीं | हाँ (इंटरफेस में companion object नहीं हो सकता) |
| विरासत | नहीं | नहीं |
उन्नत: @JvmField के साथ Companion Object (Java के लिए वास्तविक static फील्ड)
class JavaInterop {
companion object {
@JvmField
val STATIC_FIELD = "Java से सीधे एक्सेसिबल"
@JvmStatic
fun staticMethod() = "Java Static Method"
}
}
// Java कोड:
// String s = JavaInterop.STATIC_FIELD; // सीधे एक्सेस
// JavaInterop.staticMethod();
कॉन्स्टेंट्स के लिए सर्वोत्तम अभ्यास
// शीर्ष-स्तर (सबसे सरल, कोई क्लास आवश्यक नहीं)
const val API_KEY = "abc123"
const val MAX_SIZE = 100
// या object में (नेमस्पेसिंग के लिए)
object Constants {
const val API_KEY = "abc123"
const val MAX_SIZE = 100
}
// उपयोग
fun main() {
println(API_KEY)
println(Constants.MAX_SIZE)
}
निष्कर्ष
- Companion Object - अधिकांश Kotlin-ओनली कोड के लिए डिफ़ॉल्ट विकल्प
- @JvmStatic पर Object - जब Java कोड से वास्तविक static एक्सेस की आवश्यकता हो
- शीर्ष-स्तर const val - सरल स्थिरांक के लिए सर्वोत्तम
- Kotlin में `static` कीवर्ड नहीं है, लेकिन ये पैटर्न समान कार्यक्षमता प्रदान करते हैं