Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Kotlin में const और val में क्या अंतर है?

परिचय

Kotlin में `val` और `const val` दोनों अपरिवर्तनीय (read-only) गुण घोषित करते हैं, लेकिन उनके इनिशियलाइज़ेशन समय और उपयोग प्रतिबंधों में महत्वपूर्ण अंतर हैं।

const कीवर्ड

`const` का उपयोग कंपाइल-टाइम स्थिरांक के लिए किया जाता है। ये स्थिरांक क्लास फ़ाइल के बाइटकोड में एम्बेडेड होते हैं।

प्रतिबंध:

  • केवल शीर्ष-स्तर या `companion object` / `object` घोषणा में सदस्य हो सकते हैं
  • केवल प्रिमिटिव टाइप्स (Int, Long, Double, Boolean, String) के साथ
  • कंपाइल-टाइम पर मान ज्ञात होना चाहिए (कोई फ़ंक्शन कॉल, कंस्ट्रक्टर नहीं)
  • कस्टम गेटर/सेटर नहीं हो सकते

उदाहरण: const val

// शीर्ष-स्तरीय स्थिरांक
const val APP_NAME = "MyApp"
const val MAX_RETRY_COUNT = 3
const val API_BASE_URL = "https://api.example.com/"

// companion object में
class Config {
    companion object {
        const val DEFAULT_TIMEOUT = 5000L
        const val VERSION_CODE = 1
    }
}

fun main() {
    println("ऐप: $APP_NAME")
    println("अधिकतम पुनर्प्रयास: $MAX_RETRY_COUNT")
    println("टाइमआउट: ${Config.DEFAULT_TIMEOUT}ms")
    
    // const val को रनटाइम पर बदला नहीं जा सकता
    // APP_NAME = "New" // कंपाइल त्रुटि
}

आउटपुट

ऐप: MyApp
अधिकतम पुनर्प्रयास: 3
टाइमआउट: 5000ms

Val कीवर्ड

`val` रनटाइम पर इनिशियलाइज़ होने वाले रीड-ओनली गुण के लिए है।

विशेषताएं:

  • रनटाइम पर इनिशियलाइज़ होता है
  • किसी भी टाइप का हो सकता है (ऑब्जेक्ट्स, लिस्ट्स, फ़ंक्शन परिणाम)
  • कस्टम गेटर हो सकते हैं
  • क्लास प्रॉपर्टी, लोकल वेरिएबल, पैरामीटर के रूप में उपयोग किया जा सकता है

उदाहरण: val (रनटाइम इनिशियलाइज़ेशन)

fun main() {
    // रनटाइम पर गणना
    val currentTime = System.currentTimeMillis()
    val randomValue = (0..100).random()
    val userInput = readlnOrNull() ?: "डिफ़ॉल्ट"
    
    // फ़ंक्शन कॉल परिणाम
    val formattedDate = formatDate(currentTime)
    
    // ऑब्जेक्ट इंस्टेंस
    val user = User("John", 30)
    
    println("समय: $currentTime")
    println("यादृच्छिक: $randomValue")
    println("उपयोगकर्ता: $user")
}

fun formatDate(timestamp: Long): String = "फॉर्मेटेड: $timestamp"

data class User(val name: String, val age: Int)

मुख्य अंतर तालिका

पहलूconst valval
इनिशियलाइज़ेशन समयकंपाइल-टाइमरनटाइम
अनुमत टाइप्सकेवल प्रिमिटिव + Stringकोई भी टाइप
फ़ंक्शन कॉल अनुमतनहींहाँ
कहाँ घोषित किया जा सकता हैशीर्ष-स्तर, object, companion objectकहीं भी (क्लास, फंक्शन, शीर्ष-स्तर)
बाइटकोड प्रतिनिधित्वफील्ड + स्थिरांक मान एम्बेडेडफील्ड + गेटर
एनोटेशन में उपयोगहाँ (एनोटेशन पैरामीटर के रूप में)नहीं

उदाहरण: एनोटेशन में उपयोग

const val API_VERSION = "v1"

@Deprecated("Use $API_VERSION instead", ReplaceWith("newApi()"))
fun oldApi() {}

@Target(AnnotationTarget.FUNCTION)
annotation class MyAnnotation(val version: String)

// यह काम करता है - const val
@MyAnnotation(API_VERSION)
fun newApi() {}

// यह काम नहीं करेगा - val रनटाइम है
// val runtimeVersion = "v1"
// @MyAnnotation(runtimeVersion) // कंपाइल त्रुटि
fun anotherApi() {}

कब क्या उपयोग करें?

  • const val: वास्तविक स्थिरांक के लिए - API कुंजी, कॉन्फ़िगरेशन मान, डेटाबेस कॉलम नाम, एनोटेशन मान
  • val: बाकी सबके लिए - गणना किए गए मान, ऑब्जेक्ट्स, रनटाइम पर निर्धारित मान

सारांश

const val = कंपाइल-टाइम स्थिरांक (प्रिमिटिव/स्ट्रिंग केवल), val = रनटाइम रीड-ओनली (कोई भी टाइप)। जब संभव हो तो `const val` का उपयोग करें प्रदर्शन और एनोटेशन संगतता के लिए।

  1. डायरेक्टएक्स 11 और डायरेक्टएक्स 12 में क्या अंतर है? डायरेक्टएक्स 11 और डायरेक्टएक्स 12 में क्या अंतर है?

    डायरेक्टएक्स एपीआई का एक संग्रह है, या एप्लिकेशन प्रोग्रामिंग इंटरफेस, जिसका उपयोग सॉफ्टवेयर द्वारा मल्टीमीडिया सामग्री को रेंडर करने और ग्राफिकल हार्डवेयर के साथ संचार करने के लिए किया जाता है। डायरेक्टएक्स का प्रमुख घटक एपीआई, डायरेक्ट3डी, सॉफ्टवेयर और ग्राफिक्स हार्डवेयर के बीच संचार को संभालता ह

  1. C++ में const int*, const int * const, और int const * में क्या अंतर है? C++ में const int*, const int * const, और int const * में क्या अंतर है?

    यहां हम पूर्णांक पॉइंटर्स, पूर्णांक स्थिरांक और पूर्णांक स्थिरांक पॉइंटर्स के आधार पर वेरिएबल घोषणा के कुछ अलग प्रकार देखेंगे। उन्हें निर्धारित करने के लिए हम क्लॉकवाइज/स्पाइरल नियम का उपयोग करेंगे। शर्तों पर चर्चा करके, हम नियमों को भी समझ सकते हैं। const int *. यह कंपाइलर को बताने के लिए उपयोग कि

  1. - C# में const और readonly कीवर्ड्स में अंतर

    const (कॉन्स्टेंट) कंपाइल-टाइम कॉन्स्टेंट डिक्लेरेशन पर मान असाइन करना अनिवार्य बाद में मान नहीं बदल सकते अंतर्निहित रूप से static होते हैं केवल बिल्ट-इन टाइप्स (प्रिमिटिव, string, enum, null) const double PI = 3.14159; const string AppName = MyApp; // PI = 3.14; // कंपाइल त्रुटि readonly (रीड-ओ