Kotlin in Hindi : Destructuring Declarations

  • Introduction to Destructing declarations in Hindi
  • Kotlin destructuring maps in Hindi
  • Kotlin destructuring lambdas in Hindi

Introduction to Kotlin Destructuring Declarations

एक object structure बहुत से variables से मिलकर बना होता है। उन variables को object के नाम द्वारा ही access किया जाता है।

जिस प्रकार एक object structure variables से मिलकर बनता है उसी प्रकार object को destructure करके variables को extract किया जा सकता है। इस process को destructuring declarations के द्वारा perform किया जाता है।

कई बार ऐसा हो सकता है की एक object को कई variables के रूप में destructure करना आपके लिए महत्वपूर्ण हो। उदाहरण के लिए class में define किया गया कोई function सिर्फ एक ही value return कर सकता है।

लेकिन object को destructure करके आप उस class से सभी variables को extract कर सकते है फिर चाहे वे function में ही क्यों नहीं define किये गए हो।

Objects को destructure करने की ये ability programmers के लिए complex situations में भी solution प्राप्त करने की कई नयी possibilities generate करती है।

Syntax of Destructuring Declarations

Objects को destructure करने के लिए kotlin आपको special syntax provide करती है। यह syntax लगभग function call करने जैसा ही है।

val (variable1, variable2) = objectName

ऊपर दिया गया syntax आप एक object में से दो variables extract करने के लिए प्रयोग कर सकते है।

सबसे पहले आप आप यह बताते है की destructure होने वाले variables को mutable बनाना चाहते है या immutable बनाना चाहते है। यँहा पर ध्यान देने योग्य बात यह है की इससे कोई फर्क नहीं पड़ता है की class में variables mutable थे या immutable थे।

इसके बाद आप round brackets में comma से separate करके उन variables का नाम लिखते है जिन्हें आप destructure करना चाहते है। यह एक function में argument pass करने जैसा ही होता है।

इसके बाद आप assignment operator place करते है और object का नाम define करते है। यही declaration destructuring declaration कहलाता है। क्योंकि इसमें एक object को destructure किया जा सकता है। अब आप brackets में pass किये गए variables को independently use कर सकते है।

Component Functions

जब आप इस प्रकार एक object को destructure करते है तो compiler उसे निचे दी गयी form में translate करके execute करता है।

val variable1 = objectName.component1()
val variable2 = objectName.component2()

Component functions ही वे functions होते है जो object को destructure करते है। आप चाहे तो इस syntax द्वारा भी variables को extract कर सकते है। हर variable को extract करने के लिए आप एक component() function call करना होता है।

Data class के अंदर built in componentN() functions available होते है। इसलिए यदि आप किसी class के object को destructure करना चाहते है तो उसे data modifier के साथ define करते है। हालाँकि आप चाहे तो normal class भी define कर सकते है लेकिन तब आपको उस class में component functions को define करना होगा।

आपको एक बात और ध्यान रखनी चाहिए की जब आप एक class को data modifier के साथ define करते है तो आपको उसे कम से कम primary constructor में एक parameter के साथ define करना होता है।

data class myClass (val n: String, val a: Int)
{
    val Name: String = n
    val Age: Int = a
}

fun main(args: Array<String>)
{
    val myObj = myClass(“Best Hindi Tutorials”,3)
 
    val name = myObj.component1()
    val age = myObj.component2()

    println(name)
    println(age)
}

Underscore to Skip Variables

यदि आप destructuring declaration में किसी variable को include नहीं करना चाहते है तो इसके लिए आप उसकी जगह underscore(_) define करते है। Underscore से compiler को पता चलता है की आप उस variable को include नहीं करना चाहते है।

val(_, variable2) = objectName

ऊपर दिए गए code में underscore के माध्यम से यह बताया जा रहा है की variable1 को destructuring declaration में नहीं include किया जाना चाहिए।

Works with For Loops

Destructuring declarations का प्रयोग for loops में भी किया जा सकता है। एक बात आपको ध्यान रखनी चाहिए की destructure declaration के right side में कोई भी element हो सकता है लेकिन शर्त सिर्फ ये होती है की उस पर component functions call किये जाना संभव हो। 

उदाहरण के लिए एक collection में objects stored रहते है। ऐसे में for loop द्वारा आप collection के सभी items पर component method को call कर सकते है और उसकी value variable में store करके उसे independently use कर सकते है। 

for((a,b) in collection ) { … } 

Returning Two Values From Functions

Destructuring declarations के द्वारा आप एक function से दो values भी return कर सकते है। हालाँकि normally एक function से सिर्फ एक ही value return की जा सकती है।

data class myClass(val n: String, val a: Int)
{
   fun myFunction():myClass
   {
       val Name: String = n
       val Age: Int = a

       return myClass(Name, Age)
   }
}

fun main(args: Array<String>)
{
   val obj = myClass(“Best Hindi Tutorials”,3)
   val(Name, Age) = obj.myFunction()

   println(Name)
   println(Age)
}

Destructuring Declarations and Maps

Destructuring declarations का प्रयोग आप Maps के साथ भी कर सकते है। Map collection एक key और value का pair होता है।

Map के सभी items को एक sequence में store करके और उसके लिए iterator() function define करके आप for loop द्वारा सभी key और values को variables के रूप में store कर सकते है।

उदाहरण के लिए निचे दिए जा रहे code को देखिये।

for((key,value) in map) {
   // Use key and value here…
}

जैसा की आप ऊपर दिए गए code में देख सकते है destructuring declaration के साथ map को traverse किया जा रहा है और keys और values को individual values के रूप में use किया जा रहा है। 

Destructuring Declarations and Lambdas

Lambda (function के) parameters के लिए भी आप destructuring declarations का syntax उपयोग कर सकते है। यदि एक lambda में pair type के parameter है तो आप आसानी से destructuring declarations भी define कर सकते है और normal parameters भी define कर सकते है। 

{(a, b) –> …} // Destructuring declarations pair as lambda parameter

Previous: Kotlin Null Safety

Kotlin in Hindi : Null Safety

  • Introduction to kotlin null safety in Hindi
  • Kotlin references in Hindi
  • Kotlin safe call references in Hindi

Introduction to Kotlin Null Safety

Kotlin को null safety को ध्यान में रखते हुए design किया गया है। Kotlin compile time पर ही null reference को detect कर लेती है और या कोई ऐसा reference नहीं देने देती है जो की null है।

Java में null safety के लिए कोई कार्य प्रणाली उपलब्ध नहीं है। इसका नतीजा यह होता है की कई बार जब programmer unintentionally null से किसी function आदि को refer कर देता है तो null pointer exception generate हो जाती है और application crash हो जाती है।

Null safety इतनी महत्वपूर्ण है की यदि इस पर ध्यान ना दिया जाये तो इसकी वजह से बहुत अधिक नुक्सान हो सकता है। पहले भी कई organizations ने इस exception की वजह से बहुत नुक्सान उठाया है।

Kotlin द्वारा compile time पर null safety provide की जाती है। उदाहरण के लिए आप एक variable में null value नहीं store कर सकते है।

val x: String = “Best Hindi Tutorials”

x = null   // Compilation error 

ऊपर दिए गए code में x variable को null value assign की गयी है। यह declaration एक error generate करता है। यँहा पर x एक non nullable string type का variable है। यानी की x को compile time या run time कभी भी null value नहीं assign की जा सकती है।

ऐसी situation में यदि आप किसी variable को null value assign करना चाहते है तो इसके लिए आपको उसे nullable type का declare करना होगा। जैसा की आपको पता हर type का एक nullable version already kotlin में available है जो की ? से postfixed होता है।

val y: String? = “Best Hindi Tutorials”

y = null  // No error

ऊपर दिए गए code में y एक nullable string type का variable है। इसे null value assign की जा सकती है।

Kotlin References

Kotlin में दो प्रकार के references देखने को मिलते है। ये references nullable और non nullable होने से different होते है।

Non null reference 

ऊपर पहले उदाहरण में Non nullable string type का x variable create किया गया था। यदि इस variable द्वारा आप string objects के साथ available length property call करते है तो NullPointerException generate नहीं होगी क्योंकि run time पर भी x को null value assign नहीं की जा सकती है।

val x:String = “Best Hindi Tutorials”
print(x.length)  // Will not cause any exception

Nullable References

ऊपर दूसरे उदाहरण में nullable string type का y variable create किया गया था। यदि nullable type के variable से कोई property या function access किये जाते है तो वह safe नहीं होता है। ऐसे में compiler भी एक error (Only safe calls are allowed) generate करता है।

val y: String? = “Best Hindi Tutorials”
print(x.length) // Compiler generates error

लेकिन कई बार आपको nullable type के variables से भी property या functions को call करना जरुरी हो सकता है। ऐसे में kotlin आपको कई तरीके provide करती है जिनसे आप यह कार्य कर सकते है।

Checking For Null in Conditions

एक nullable type के object से refer करने के लिए आप पहले तरीके के रूप में null condition के लिए check कर सकते है। इस तरीके में आप दोनों conditions (null होने की और null नहीं होने की) के लिए अलग अलग code provide कर सकते है। 

if(y!=null)
{
   print(y.length)
}
else
{
   print(“null”)
}

आपके द्वारा perform किये जाने वाले condition check को compiler track करता है और if block के अंदर length property call को allow कर देता है।

एक बात आपको ध्यान रखनी चाहिए की ऐसा सिर्फ immutable objects के साथ ही होता है।

Kotlin Safe Call Operator (?.)

एक nullable type के object से किसी property को या function को safe तरीके से call करने के लिए kotlin आपको safe call operator (?.) provide करती है।

val z: String? = null
print(z?.length)

जैसा की आप ऊपर दिए गए code में देख सकते है, z variable में null value store की गयी है। इसके बाद safe call operator के द्वारा z से length property को call किया गया है। Safe call operator के साथ call करने की वजह से कोई exception generate नहीं होगी फिर चाहे object की value null हो या ना हो।

Safe call operators chains के लिए बहुत उपयोगी होते है। एक chain की सभी values को null के लिए check किया जाता है यदि chain में कोई भी object null है तो पूरी chain का result भी null होगा और यदि कोई भी object null नहीं है तो appropriate result प्राप्त होगा।

Elvis Operator (?:)

एक nullable reference में यदि null value होती है तो यह आवश्यक नहीं है की null value ही use की जाए। आप चाहे तो उसकी जगह कोई एक निश्चित value भी use कर सकते है।

ऐसा करने के लिए आप elvis operator उपयोग करते है। इस operator के left side में दिया गया expression यदि null नहीं है तो वही value उपयोग की जाएगी नहीं तो इस operator के right side में दी गयी value उपयोग की जाएगी।

val z: String? = null
print(z?.length ?: -1)

ऊपर दिए गए code में z को null assign किया गया है। लेकिन elvis operator की मदद से null की बजाय z की length को -1 print किया गया है।

Not-null Assertion Operator (!!)

Casting के लिए kotlin आपको एक और उपयोगी operator provide करती है। यह operator एक value को non null type में convert करता है और यदि value null होती है तो exception generate होती है। 

val z: String? = null
print(z!!.length)

ऊपर दिए गए code में क्योंकि z को null value assign की गयी है इसलिये second line के execute होने पर NullPointerException generate होगी।

Safe casting के बारे में विस्तृत जानकारी के लिए आप kotlin type checking and casting tutorial पढ़ सकते है।

Previous: Kotlin Type Checking and Casting
Next: Kotlin Destructuring Declarations

Kotlin in Hindi : Type Checking and Casting

  • Introduction to kotlin type checking in Hindi
  • Kotlin smart casts in Hindi 
  • Kotlin explicit casting in Hindi

Introduction to Kotlin Type Checking

कई popular programming languages type checking और casting के लिए functionalities provide करती है। Kotlin में भी यह feature उपलब्ध है।

Type of Object 

कई बार जब आप mixed types के साथ कार्य करते है तो run time पर यह जानना आवश्यक हो जाता है की एक object किस type (class) का है।

उदाहरण के लिए आप objectA का reference objectB को runtime पर assign करवा रहे है। ऐसे में पहले आपको यह check करना आवश्यक है की दोनों same type (class) के object है या नहीं। क्योंकि यदि दोनों object same type के नहीं है तो ऐसा नहीं किया जा सकता है।

is Operator 

इस कार्य के लिए kotlin आपको is operator provide करती है। इस operator के द्वारा आप compile time पर यह पता कर सकते है की एक object किस type का है।

val Message: String = “Hello reader!”

if(msg is String)
{
   print(“Message is a string object”)
}

ऊपर दिए गए code में Message एक string object है। If statement में is operator के माध्यम से यह confirm किया गया है।

Negated Form (!is)

Kotlin में is operator की एक negation form भी है। यह form negated सन्दर्भ में उपयोग की जाती है। 

val Message: String = “Hello reader!”

if(Message !is String)
{
   print(“Message is not string.”)
}

Kotlin Type Casting

जब आप किसी एक type के variable की value को किसी दूसरे type के variable को assign करना चाहते है तो ऐसा आप directly नहीं कर सकते है। इसके लिए पहले आपको उस value को cast करने की आवश्यकता होती है ताकि वह दूसरे type में store की जा सके।

Java में compatible types को आपस में cast करने के लिए cast () operator का प्रयोग किया जाता है। उदाहरण के लिए आप एक integer variable की value को string variable को assign करना चाहते है तो इसके लिए पहले आपको integer value को string में cast करना होगा।

int num = 5;
String value = (String) num;

ऊपर दिए गए code में num variable की value को string में cast करके string variable को assign किया गया है।

Kotlin Smart Casting 

Java के तरीके से हटकर kotlin आपको एक special type की casting ability provide करती है। जिसे kotlin में smart casting कहा जाता है।

Kotlin में is operator का type check करने के अलावा एक काम और भी है। जब आप किसी type को is operator द्वारा check करते है तो वह automatically उस type में cast हो जाता है।

उदाहरण के लिए निचे दिया code देखिये।

fun main(args: Array<String>)
{

val obj: Any = “Best Hindi Tutorials”;

if(obj is String)
{
    print(obj.length)
}

}

ऊपर दिए गए code में Any type के object को is operator द्वारा automatically string में cast किया गया है। यदि object cast नहीं किया गया होता तो उसके साथ length property का प्रयोग किया जाना संभव नहीं था।

Smart Casting Rules

Kotlin में smart casting सभी types के साथ possible नहीं है। यह केवल compiler द्वारा automatically तब ही perform की जाती है जब compiler को लगता है की casting और उसका उपयोग संभव है। निचे कुछ elements बताये जा रहे जिनके साथ smart casting संभव है 

  • val local variables – Val local variables के साथ smart casting हमेशा संभव है। लेकिन local delegated properties के साथ ऐसा नहीं किया जा सकता है। 
  • val properties – यदि property private या internal है और जँहा property को declare किया गया है वँही पर check perform किया गया है तो smart casting संभव है। Open properties या ऐसी properties जिनका custom getter declare किया गया है उनके साथ smart casting सम्भव नहीं है। 
  • var local variables – यदि variable check करने और use करने के बीच modify नहीं किया गया है, यदि उसे किसी lambda द्वारा नहीं catch किया गया है जो उसे modify नहीं करता है और यदि variable local delegated property नहीं है। 
  • var properties – Var properties के साथ smart casting possible नहीं है। 

Kotlin Explicit Casting

Kotlin में is operator द्वारा की गयी casting automatic होती है। लेकिन जैसा की आपको पता है इस प्रकार की casting हर संदर्भ में संभव नहीं होती है।

ऐसे में casting explicitly (manually) cast operator द्वारा perform की जाती है। Cast operator का concept कई programming languages में है लेकिन kotlin में cast operator अलग है।

Cast Operator as (Unsafe)

Kotlin आपको as cast operator provide करती है जो casting perform करने के लिए use किया जाता है। Compatible types के बीच casting आसानी से हो जाती है। यदि  types के बीच casting संभव नहीं होती है तो ClassCastException generate होती है। यही कारण है की इस operator को unsafe cast operator भी कहा जाता है।

val obj: Any = 555
val myValue: String = obj as String // Generates exception

ऊपर दिए गए उदाहरण में integer object को as operator द्वारा string में cast करने का प्रयास किया गया है।  यह code exception generate करता है क्योंकि integer को string में नहीं cast किया जा सकता है।

Cast Operator as? (Safe)

Kotlin में as operator की एक form as? है जो की as से safe casting perform करने के लिए प्रयोग की जाती है। यह operator compatible types के साथ आसानी से casting perform कर देता है और यदि दो types के बीच casting संभव नहीं होती है तो exception generate करने की बजाय यह operator null return करता है।

val obj: Any = 555
val myValue: String = obj as? String

print(myValue)   // It will print null

Previous: Kotlin Exceptions
Next: Kotlin Null Safety

Kotlin Tutorial in Hindi

Kotlin Tutorial in Hindi

Kotlin Google द्वारा android application development के लिए create की गयी है। Google ने kotlin को android development के लिए official programming language घोषित किया है।

Kotlin java को इस क्षेत्र में replace कर रही है। क्योंकि kotlin में बहुत से ऐसे advanced features को introduce किया गया है जो java में उपलब्ध नहीं है।

Kotlin द्वारा आप कोई भी कार्य java से जल्दी और कम code में perform कर सकते है। Java में कुछ ऐसे drawbacks है जिनको change नहीं किया जा सकता है और जो app development को सिमित बनाते है। Kotlin आपको वे सब features provide करती है जो android app development के लिए अनिवार्य है।

यदि आपने Java पढ़ी हुई है तो आसानी से kotlin सीख सकते है। Kotlin एक functional language भी है और object oriented भी है। Kotlin java के साथ interoperable है।

हालाँकि kotlin और java के code को एक साथ use किया जा सकता है। लेकिन क्योंकि kotlin को android app development के लिए official language घोषित कर दिया गया है। इसलिए अब kotlin को android apps develop करने के लिए अधिक प्रयोग किया जाने लगा है।

यदि आप एक android developer बनना चाहते है तो आपको kotlin programming language को निश्चित रूप से सिख लेना चाहिए। क्योंकि android app development का future kotlin के साथ ही है। Kotlin सिख कर आप android app developer बनने की तरफ अपना पहला कदम बढ़ा सकते है।

इसी बात को ध्यान में रखते हुए Best Hindi Tutorials के readers के लिए Kotlin की सरल और आसानी से समझने योग्य tutorials provide की गयी है। ये सभी tutorials Hindi language में उपलब्ध है। Kotlin के सभी topics को सरल उदाहरणों द्वारा detail से समझाया गया है।

Kotlin tutorial series की सभी tutorials की list निचे provide की जा रही है। आप इनके द्वारा kotlin सीखना शुरू कर सकते है।

Table of Contents

  1. Kotlin Introduction : इस tutorial में आप kotlin के बारे में सामान्य जानकारी प्राप्त करेंगे। Kotlin की history और features के बारे में इस tutorial में detail से बताया गया है। 
  2. Kotlin Basic Types : सभी popular languages की तरह kotlin भी data types provide करती है जो की classes के रूप में implement किये गए है। इस tutorial में आप kotlin में available Number, Boolean, Array, Character आदि types के बारे में बताया गया है। 
  3. Kotlin Variables : Variables का प्रयोग data को store करने के लिए किया जाता है ताकि उस data के साथ operations perform किये जा सके। इस tutorial में kotlin में var और val keywords द्वारा variables create करना और उनकी values print करना समझाया गया है।
  4. Kotlin Classes : Class object oriented programming में सबसे महत्वपूर्ण element होती है। इस tutorial में आप kotlin में classes, primary और secondary constructors और objects के बारे में जानेंगे।
  5. Kotlin Properties : Properties classes में define की जाती है और private field पर define की जाती है। इस tutorial में kotlin में mutable और immutable properties create करना, late initialized properties create करना और properties को override करना बताया गया है।
  6. Kotlin Class Inheritance : Inheritance के द्वारा एक class दूसरी class के public और protected members को access कर पाती है। इस tutorial में kotlin में inheritance को implement करना और methods और properties को override करना बताया गया है।
  7. Kotlin Visibility Modifiers : Visibility modifiers के माध्यम से program में abstraction implement किया जाता है। इस tutorial में visibility modifiers का परिचय और विभिन्न elements के साथ उनके प्रयोग को विस्तार से बताया गया है।
  8. Kotlin Delegation : Delegation के द्वारा एक class अपने कार्य किसी दूसरी class को delegate कर सकती है। इस tutorial में kotlin में delegation को implement करना और by keyword का प्रयोग करना बताया गया है।
  9. Kotlin Delegated Properties : Delegated properties के माध्यम से आप कई महत्वपूर्ण functionalities achieve कर सकते है। इस tutorial में delegated properties create करना और उन्हें उपयोग करना बताया गया है।
  10. Kotlin Extensions : Extensions के माध्यम से एक class के साथ additional functionalities attach की जाती है। इस tutorial में extension functions और extension properties को create और use करना बताया जायेगा।
  11. Kotlin Interfaces : Interfaces के प्रयोग से classes एक template को implement कर सकती है। इस tutorial में kotlin में interfaces create करना और उन्हें उपयोग करना बताया गया है।
  12. Kotlin Sealed Classes : Sealed classes restricted type hierarchies को represent करने के लिए use की जाती है। इस tutorial में आप sealed classes define करना और use करना सीखेंगे।
  13. Kotlin Nested & Inner Classes : एक class के अंदर आप दूसरी class भी create कर सकते है। ऐसी classes nested और inner दो प्रकार की होती है। इस tutorial में आप kotlin में nested और inner classes create करना सीखेंगे। इसके अलावा आप anonymous inner class भी create करना सीखेंगे।
  14. Kotlin Enum Classes : Kotlin में enum type को classes के रूप में implement किया जाता है। इस tutorial में enum classes create करना और उनके साथ कार्य करना सीखेंगे।
  15. Kotlin Inline Classes : Kotlin में inline classes का concept provide किया गया है जिन्हें wrap करने पर भी extra overhead नहीं बढ़ता है।
  16. Kotlin Generics : Generic mechanism से आप ऐसा code लिख सकते है जो कई types के साथ execute किया जा सकता है। इस tutorial में kotlin में generic code लिखना बताया गया है।
  17. Kotlin Control Flow : Control flow statements का प्रयोग program के flow को control करने के लिए किया जाता है। इस tutorial में आप kotlin में available control flow statements को बताया गया है।
  18. Kotlin Packages : Packages का प्रयोग multiple kotlin files को organize करने के लिए किया जाता है। इस tutorial में kotlin में packages create करना और default kotlin package के बारे में बताया गया है।
  19. Kotlin Collections : Collections के द्वारा data को अलग अलग प्रकार से store और process किया जा सकता है। इस tutorial में आप kotlin में available different collections के बारे में जानेंगे।
  20. Kotlin Ranges :  Kotlin में आप values की ranges create करके उन पर operations perform करने की ability provide करती है। इस tutorial में ranges के साथ कार्य करना और primitive type ranges के बारे में बताया गया है।
  21. Kotlin Annotations : Annotation के माध्यम से code के साथ metadata attach किया जाता है। इस tutorial में kotlin meta annotations और annotations create करना बताया गया है।
  22. Kotlin Equality : सभी programming languages में equality अलग अलग प्रकार से compare की जाती है। इस tutorial में आप kotlin में available structural और referential equality provide की जाती है।
  23. Kotlin This Expression : This expression का प्रयोग current object को refer करने के लिए किया जाता है। इस tutorial में आप जानेंगे की kotlin में this keyword का प्रयोग extension function के receiver type को denote करने के लिए किया जाता है।
  24. Kotlin Exceptions :  सभी programming languages की तरह kotlin भी आपको exception handling mechanism provide करती है। इस tutorial में kotlin में आप exceptions को handle करना बताया गया है।
  25. Kotlin Type Checking & Casting : Kotlin आपको type checking के लिए कुछ operators provide करती है जो smart casting perform करते है। इस tutorial में आप kotlin में type checking और casting करना सीखेंगे। 
  26. Kotlin Null Safety : Kotlin के सबसे महत्वपूर्ण features में से एक null safety है। इस tutorial में आप kotlin में available nullable और non-null references के बारे में जानेंगे और उनके साथ null safety achieve करना सीखेंगे। 
  27. Kotlin Destructuring Declarations : Kotlin आपको एक object को destructure करके उसके variables को independently उपयोग करने की ability provide करती है। इस tutorial में आप objects के destructuring declarations define करना सीखेंगे।  

आशा है की Best Hindi Tutorials द्वारा किया गया यह प्रयास आपको पसंद आएगा। 

Kotlin in Hindi : Exceptions

  • Introduction to kotlin exceptions in Hindi
  • Kotlin exceptions classes in Hindi
  • Kotlin checked exceptions in Hindi

Introduction to Kotlin Exceptions

किसी भी programmer के लिए exceptions को handle करना बहुत जरुरी होता है। इससे आपकी application crash होने से बच जाती है और bad user experience भी नहीं create होता है। 

Java की तरह kotlin भी आपको exception handling mechanism provide करती है। Java और kotlin में exception handling लगभग एक समान है आपको अलग से कुछ सिखने की आश्यकता नहीं है। 

Run Time Error

Exceptions runtime errors होती है। Runtime errors वे errors होती है जो program execution के दौरान आती है और execution को रोक देती है। इसे program crash होना भी कहा जाता है।

Exceptions unexpected होती है और इन्हें रोका नहीं जा सकता है सिर्फ इन्हें handle किया जा सकता है। यानी की program को crash होने से रोका जा सकता है।

उदाहरण के लिए यदि program को execute होने के लिए computer में पर्याप्त memory उपलब्ध नहीं है तो program को run करते समय exception generate होगी और program का execution रुक जायेगा। 

Exceptions syntax errors (compile time errors) से अलग होती है। Syntax errors program को run करने से पूर्व compile time पर आती है और उन्हें program syntax में सुधार करके ठीक किया जा सकता है।

उदाहरण के लिए आप एक bracket add करना भूल जाते है तो compiler आपको element missing जैसी errors show करता है और जैसे ही आप उस syntax को सुधार लेते है तो वह error भी चली जाती है।

Ability to Handle Exceptions

Kotlin आपको exceptions को handle करने की ability provide करती है। जिसे exception handling कहा जाता है। इसके लिए kotlin आपको कई keywords provide करती है।

Kotlin में available keywords का प्रयोग करके आप exception handling mechanism को implement कर सकते है।

Application Crashes If Not

यदि आप अपनी application में exceptions को handle नहीं करते है तो आपकी application एक robust  application नहीं होती है। ऐसी applications कभी भी crash हो सकती है। 

यदि industry standard की बात की जाय तो exception handling अनिवार्य और बहुत important task है।  

Exception Classes 

Java की ही तरह kotlin में भी exceptions को classes के द्वारा represent किया गया है। उदाहरण के लिए ArithmeticException class arithmetic exceptions को represent करती है।

Kotlin में available Throwable class सभी exception classes द्वारा inherit की गयी है। Throwable class को Error और Exception दो classes inherit करती है। इनमें Exception class को सभी exceptions inherit करती है।

Throwable
 |– Error
 |– Exception
      |– IllegalCallableAccessException
      |– IllegalPropertyDelegateException
      |– NoSuchPropertyException
      |– RunTimeException
           |– ArithmeticException
           |– ClassCastException
           |– ConcurrentModificationException
           |– FreezingException
           |– IllegalArgumentException
           |– IllegalStateException
           |– IncorrectDereferenceException
           |– IndexOutOfBoundsException
           |– InvalidMutabilityException
           |– NoSuchElementException
           |– NoWhenBranchMatchedException
           |– NullPointerException
           |– UninitializedPropertyAccessException
           |– UnsupportedAccessException

Checked & Unchecked Exception

Mostly exceptions checked और unchecked दो प्रकार की होती है। इनमें checked exception ऐसी exception होती है जिसे compile time पर check किया जाता है।

Checked exceptions के बारे में पहले से ही पता होता है। इन्हें throw keyword के प्रयोग से generate किया जाता है। Unchecked exceptions compile time पर known नहीं होती है। ये unexpected exceptions होती है।

एक बात आपको हमेशा ध्यान रखनी चाहिए की kotlin में checked exceptions allow नहीं है। Java में इससे होने वाली समस्याँओ को ध्यान में रखते हुए kotlin में checked exception को allow नहीं किया गया है।

Handling Exceptions in Kotlin 

Kotlin में exceptions try, catch और finally keywords द्वारा handle की जाती है। ये सभी keywords अलग अलग code blocks को represent करते है। 

try
{
  // Code that may generate an exception.
}
catch(e: ExceptionName)
{
  // Handle exception here
}
finally
{
  // Optional code to perform.
}

Try block में वह code लिखा जाता है जिससे संभवतः exception generate हो सकती है। Try block के बाद catch block लिखा जाता है। Catch block में ही generate हुई exception को handle किया जाता है।

Catch block में एक argument भी pass किया जाता है। जिसे exception argument कहा जाता है। यह उसी type का होता है जो exception आप catch block में handle करना चाहते है।

उदाहरण के लिए आप try block में arithmetic exception handle करना चाहते है तो इसके लिए try block इस प्रकार define करेंगे।

catch(e: ArithmeticException)

एक try block के बाद आप multiple catch blocks define कर सकते है। आप अलग अलग type की exceptions को इन catch blocks में handle कर सकते है।

Catch block में pass किये जाने वाले argument से आप उस exception से सम्बंधित जानकारी print कर सकते है। इसके लिए Message और StackTrace जैसी properties आप use कर सकते है जो सभी exception types के साथ available है।

catch(e: ArithmeticException)
{
   print(e.Message)
}

Finally block में वह code लिखा जाता है जो चाहे exception generate हो या ना हो हर situation में execute होता है। इस block में आप connection terminate करना और resources free करना जैसे कार्य कर सकते है। Try block के बाद कम से कम एक catch या finally block होना अनिवार्य होता है। 

Try is an Expression 

Kotlin में आप try और catch block को expression के रूप में भी use कर सकते है। इससे आप variable assignment को भी exception के लिए guard कर सकते है। यह feature exceptions को handle करने की आपकी ability को extend करता है। 

val a: Int? = try{parseInt(input)}catch(e:NumberFormatException){null} 

ऊपर दिए उदाहरण में यदि input को int में parse नहीं किया जा सकेगा तो a variable को null value assign कर दी जायेगी।

Previous: Kotlin This Expression and Type Aliases
Next: Kotlin Type Checking and Casting

Kotlin in Hindi : This Expression & Type Aliases

  • Introduction to kotlin this expression in Hindi
  • Usage & example of kotlin this expression in Hindi
  • Introduction to kotlin type aliases in Hindi

Introduction to Kotlin This Expression

Java में जब भी आपको class के अंदर से ही उस class के object (current object) को refer करना होता है तो आप this keyword का प्रयोग करते है। Java में this का यही प्रमुख उपयोग भी है।

Kotlin में this को expression के रूप में introduce किया गया है। Kotlin में this का प्रयोग current receiver को denote करने के लिए किया जाता है।

Kotlin में this expression के दो प्रमुख उपयोग है।

In Member Class

एक member class में this expression को उस class के current object को refer करने के लिए प्रयोग किया जाता है। This expression का यह use java में available this keyword के समान है। 

class myClass(val n: String)
{
    val Name: String
   
     init
     {
          this.Name = n
     }
   
     fun display()
     {
         print(this.Name)
     }
}

fun main(args: Array<String>)
{
    var obj = myClass(“Best Hindi Tutorials”)
    obj.display()
}

In Extension Function

एक extension function में this receiver parameter को denote करने का कार्य करता है। Receiver parameter वह parameter होता है जो dot operator के left में define किया जाता है।

class myClass(val n: String)
{
   val Name: String
 
    init
    {
            this.Name = n
    }

     fun display()
     {
          print(this.Name)
      }
}

fun myClass.nickName()
{
    print(this.Name)
}

fun main(args: Array<String>)
{
   val obj = myClass(“Best Hindi Tutorials”)
    obj.display()
    obj.nickName()
}

Qualified This 

यदि आप inner classes का प्रयोग कर रहे है तो this expression से confusion पैदा हो जाता है। क्योंकि यह पता नहीं चल पाता है की किस class के current object को वह this refer कर रहा है।

ऐसी situation में this को अलग अलग scopes में define करने के लिए label qualifiers use किये जाते है। Label qualifiers को @ symbol के साथ define किया जाता है। Labels बताते है की this किस class के current object को refer करता है।

class outerClass
{
   val Name: String = “Outer Class”

        inner class innerClass
       {
           val Name: String = “Inner Class”

           fun display()
           {
               print(this@outerClass.Name)
               print(this@innerClass.Name)
           }
       }
}

fun main(args: Array<String>)
{
     outerClass().innerClass().display()
}

Introduction to Kotlin Type Aliases

Kotlin आपको longer type names के shorter alternative names create करने की ability provide करती है। इन्हें type aliases कहा जाता है।

यह उन situations में उपयोगी होता है जब type का नाम बहुत बड़ा हो और आपको बार बार उसे लिखने में परेशानी हो रही हो। ऐसे में आप उस नाम का एक shorter alternative create करके उसे आसानी से उपयोग कर सकते है।

उदाहरण के लिए inner class को refer करने के लिए बहुत बड़ा syntax हो जाता है। Types aliases की मदद से आप उसे छोटा स्वरूप दे सकते है और सुविधापूर्वक उपयोग कर सकते है।

Type aliases create करने से कोई नया type नहीं define होता है और ना ही उसकी कार्य प्रक्रिया में किसी प्रकार अंतर आता है। सिर्फ एक name define होता है जिसे उस type name की तरह use किया जा सकता है।

Type aliases create करना आपके लिए कई प्रकार से उपयोगी साबित हो सकता है। 

Shorten Long Generic Types 

जैसा की आप जानते है generic types की definition काफी लम्बी होती है और इस वजह से उसे use करना थोड़ा कठिन भी लगता है। ऐसे में आप generic types के aliases create करके उन्हें use कर सकते है। 

Function Types Aliases 

Generic types की ही तरह function types का declaration lengthy और अटपटा होता है। Kotlin में आप function types के भी aliases create कर सकते है।

Inner and Nested Class Aliases

जैसा की आपको पता है inner और nested class के members को resolve करने के लिए आपको बहुत बड़ा syntax use करना पड़ता है। ऐसे में aliases create करके आपके उसे short बना सकते है।

Previous: Kotlin Equality
Next: Kotlin Exceptions

Kotlin in Hindi : Equality

  • Introduction to kotlin equality in Hindi
  • Kotlin structural equality in Hindi
  • Kotlin referential equality in Hindi

Introduction to Kotlin Equality

कई बार आपको दो variables, दो objects या दो references को compare करने की आवश्यकता होती है। ज्यादातर programming languages में इसके लिए equality operator (==) का प्रयोग किया जाता है।

Equality operator (==) यह check करता है की दो variables, objects या references एक समान है या नहीं। यदि ऐसा है तो true return किया जाता है नहीं तो false return किया जाता है।

Equality operator का एक और variance होता है जिसे not equal (!=) कहा जाता है जो यह check करता है की दो variables, objects या references एक दूसरे के बराबर नहीं है। यदि बराबर नहीं होते है तो true return किया जाता है और यदि बराबर होते है तो false return किया जाता है।

Equality operator का प्रयोग आपने control statements में निश्चित रूप से किया होगा। जिसमें किसी condition को test करके उसके अनुसार statements execute किये जाते है।

आप कोई भी programming language use करें equality operator को variables, objects और references के बीच equality check करने के लिए use किया जाता है। लेकिन kotlin में यह थोड़ा अलग है।

Kotlin में दो प्रकार की equality पायी जाती है। Kotlin में variables को use करने के लिए अलग equality operator का प्रयोग किया जाता है और objects और उनके references को compare करने के लिए अलग equality operator use किया जाता है। इन्हें kotlin में structural और referential equality कहा जाता है।

Kotlin Structural Equality (==)

Kotlin में दो variables को compare करने के लिए double assignment (==) operator use किया जाता है। इसे kotlin में structural equality operator कहा जाता है। 

जँहा दूसरी programming languages जैसे की Java आदि में इस operator द्वारा variables और references को भी compare किया जाता है वँही kotlin में इसे सिर्फ variables और data को compare करने के लिए किया जाता है। 

Data से यँहा मतलब raw data से है जो की किसी variable में store नहीं किया गया है। उदाहरण के लिए आप 3 और 5 integer numbers को compare करें तो वह data comparison कहलायेगा क्योंकि इन्हें variables में store नहीं किया गया है। 

इस operator का दूसरा variance (!=) check करता है की दो variables समान नहीं है।

Example

fun main(args: Array<String>)
{
    val a: Int = 5
    val b: Int = 5

    // Checking structural equality
    if(a==b)
    {
         print(“Both variables are equal”)
    }
}

.equals()

Kotlin में structural equality को equals() function द्वारा भी compare किया जा सकता है। यह function ज्यादातर objects को compare करने के लिए use किया जाता है। 

इस function को एक object के साथ call किया जाता है और दूसरा object इसमें argument के रूप में pass किया जाता है। यह function kotlin में Any class द्वारा implement किया गया है। 

Kotlin में == और equals method को use करने में difference यह है की equals method float और double types के comparison के लिए IEEE 754 Standard for Floating-Point Arithmetic को follow नहीं करता है। 

Null Equality 

यदि आप structural equality operator (==) द्वारा NULL value को compare करते है। ऐसी situation जिसमे दोनों में से कोई भी variable null hold करता है तो ऐसे में उसे automatically referential equality में change कर दिया जाता है और उन दो variables के references को check किया जाता है। 

यदि आप किसी variable को null से compare करने का प्रयास करते है तो भी ऐसा ही होता है। 

Custom Equal Check Implementation

Kotlin में आप अपना स्वयं का भी check mechanism implement कर सकते है। इसके लिए आप Any class में available equals() function को override कर सकते है। इस function को override करने से == या != operators पर कोई असर नहीं होता है। 

Kotlin में equals() function इसीलिए ही provide किया गया है ताकि इसे override किया जा सके। 

Kotlin Referential Equality (===)

Kotlin में दो variables या objects के references को compare करने के लिए triple assignment operator use किया जाता है। इसे kotlin में referential equality operator कहा जाता है। 

Kotlin में यह operator references की समानता को compare करता है। यदि दो references समान होते है तो true return किया जाता है नहीं तो false return किया जाता है। 

इस operator का दूसरा variance (!==) होता है जो की दो references की असमानता को compare करता है। यदि दो references असमान होते है तो true return किया जाता है नहीं तो false return किया जाता है।

Example

class myClass(val n: Int)
{
    val num: Int
 
    int
    {
         num = n
    }
}

fun main(args: Array(String)
{
    var obj1 = myClass(5)
    var obj2 = myClass(1)

    obj2 = obj1

    if(obj1===obj2) //Checking referential equality
    {
          print(Both are equal)
    }
}

Previous: Kotlin Annotations
Next: Kotlin This Expression and Type Aliases

Kotlin in Hindi : Annotations

  • Introduction to kotlin annotations in Hindi
  • Kotlin meta annotations in Hindi
  • Example of kotlin annotations in Hindi

Introduction to Kotlin Annotations

Kotlin में annotation code के metadata attach करने का एक माध्यम है। Metadata code से संबधित जानकारी होती है जो अपरिचित programmer द्वारा आसानी से समझी जा सकती है और code के उपयोग में सहायक होती है।

annotation Modifier

Annotation define करने के लिए annotation modifier का प्रयोग किया जाता है। उदाहरण के लिए किसी class के लिए annotation इस प्रकार define किया जा सकता है। 

annotation class annotClass

यँहा पर annotClass एक annotation class है।

Meta Annotations

Annotation के अतिरिक्त attributes define करने के लिए annotation class को भी meta annotations द्वारा annotate किया जाता है। Meta annotations को annotation class के declaration से पूर्व define किया जाता है।

  • @Target –  यह  meta annotation उन सम्भावित elements को बताता है जो annotation के साथ annotate किये जा सकते है। 
  • @Retention – यह meta annotation बताता है की, annotation को compile की गयी class file में store किया गया है या नहीं और यह reflection के द्वारा runtime पर visible होगी या नहीं। By default ये दोनों ही true होती है। 
  • @Repetable – यह meta annotation एक element के साथ बार बार वही annotation उपयोग करने की अनुमति देता है। 
  • @MustBeDocumented – यह meta annotation बताता है की annotation public API का हिस्सा है और generate किये हुए API documentation में दिखाए गए class और method में include किया जाना चाहिए। 

इन meta annotations के साथ आप ऊपर दी गयी annotClass को दुबारा इस प्रकार define कर सकते है।

@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class annotClass

Using Annotations

Annotation class के साथ normal class और function को इस प्रकार define किया जा सकता है। 

@annotClass class myClass
{
    @annotClass fun myFunction(@annotClass num: Int): Int
    {
         return (@annotClass 1)
    }
}

जैसा की आप देख सकते है यह एक आसानी से समझ आने योग्य declaration है। Class और function को annotation class से prefix किया गया है और parameters और return value को भी annotation class के साथ define किया गया है।

जिन elements को annotation से define किया जाता है वे उसी annotation के आधार पर compiler द्वारा treat किये जाते है। 

Annotating Primary Constructor

Primary constructor को annotate करने के लिए constructor declaration में constructor keyword को add करना होता है। इस keyword के पूर्व ही annotation को add किया जाता है। 

class myClass @Inject constructor(parameters)
{
 
}
ऊपर दिए गए code में constructor keyword से पूर्व @Inject annotation का प्रयोग करके primary constructor को annotate किया गया है।

Annotating Property Accessors

Annotations के द्वारा आप property accessors को भी annotate कर सकते है। इसके लिए आप simply accessors से पूर्व annotation define करते है।

class myClass
{
   var temp: Int = x
    @Inject set
     …
}

Annotating Lambdas

Kotlin में lambdas को भी annotate किया जा सकता है। Annotation को method body से पूर्व invoke() method पर apply किया जाता है।

annotation class annotLamnda

val x = @annotLambda {
 //lambda body
}

Annotation Constructors

Annotations के constructors भी हो सकते है जो parameters accept करते है। उदाहरण के लिए निचे define की गयी annotation class conAnnot को देखिये।

annotation class conAnnot(val name: String)

ऊपर define की गयी conAnnot annotation class का constructor define किया गया है जो argument के रूप में एक string नाम accept करता है।

जब इस annotation class को use किया जायेगा तो annotation define करने के साथ argument भी pass किया जायेगा। जैसा की निचे दिखाया गया है।

@conAnnot(“Best Hindi Tutorials”) class myClass
{
 
}

Allowed Parameter Types for Annotation Constructors

Annotation constructors में निचे दिए जा रहे type के parameters ही allowed है।

  • Primitive types, जो की java में भी primitive types है। 
  • Strings 
  • Class 
  • Enums 
  • Annotations 
  • ऊपर दिए गए types का array 
Nullable types को annotation constructor में parameter के रूप में नहीं use किया जा सकता है। यदि आप annotation को parameter के रूप में pass कर रहे तो इसके लिए उसे @symbol से prefix करने की आवश्यकता नहीं है।

यदि आप एक class को parameter के रूप में pass करना चाहते है तो इसके लिए आपको kotlin KClass use कर सकते है।

Use-site Targets

जब kotlin code byte code में generate किया जाता है तो kotlin के एक element से कई java element generate हो जाते है। ऐसे में annotate करने के लिए बहुत सी locations available हो जाती है। Annotation के पूर्ण रूप से कार्य करने के लिए उन सभी elements को भी annotate किया जाना आवश्यक होता है। 

लेकिन ऐसा code के byte code में generate होने के बाद नहीं किया जा सकता है। आप पहले ही यह specify कर सकते है की एक annotate किया जा चुका element byte code में किस प्रकार generate होगा। 

इस प्रकार कई java targets को annotate किया जा सकता है। 

  • file 
  • property 
  • field 
  • get 
  • set 
  • receiver 
  • param 
  • set 
  • param 
class Example(@field:Ann val foo,@get:Ann val bar, @param:Ann val quux)

ऊपर दिए गए code में java के field, getter और constructor parameter को annotate करने के instructions compiler को दिए गए है। 

Java Annotations

Java annotations kotlin से पूरी तरह compatible है। Java annotations को kotlin code में use किया जा सकता है। निचे दिए जा रहे code snippet में java annotations को kotlin में use करना बताया जा रहा है।

// Java Annotation
public @interface Ann
{
    int intValue();
    String stringValue();
}
// Kotlin Annotation
@Ann(intValue = 1, stringValue = “abc”) class C 

Previous: Kotlin Ranges
Next: Kotlin Equality

Kotlin in Hindi : Ranges

  • Introduction to kotlin ranges in Hindi
  • Kotlin primitive type ranges in Hindi
  • Kotlin ClosedRange<T> interface in Hindi

Introduction to Kotlin Ranges

Kotlin आपको कुछ निश्चित values की range पर भी operations perform करने की ability provide करती है। यह feature उन situations में available है जब आपके पास कोई एक option available ना होकर options की range available हो।

एक range values का क्रम होता है। एक range की lower और higher values होती है जो उस range के start और end को दर्शाती है।

उदाहरण के लिए 1 2 3 4 5 6 7 8 9 10 एक range है। इसमें 1 lower value है जो की range के start को दर्शाती है और 10 higher value है जो range के end को दर्शाती है।

हालाँकि इस range में 10 अलग अलग values है। लेकिन kotlin आपको एक साथ इन 10 values की range में operations perform करने की ability provide करती है। कोई भी value जो range में नहीं है उस पर वह operation apply नहीं होगा।

Comparable Type Ranges

एक range को किसी भी comparable type के लिए define किया जा सकता है। Comparable type से यँहा मतलब है की ऐसी classes जो Comparable interface को implement करती है।

Comparable interface को implement करने वाली classes के instances के बीच एक total ordering defined होती है। इससे इन्हें ranges के रूप में use किया जा सकता है।

Comparable interface में ranges के लिए विभिन्न functions provide किये गए है।

  • rangeTo() – यह function start element से end element तक की range define करने के लिए use किया जाता है। 
  • downTo() – यह function reverse iteration के लिए प्रयोग किया जाता है। 
  • step() – यह function step को define करता है जो की range में दो elements की दुरी होती है। 

इन सभी functions की operator forms भी available है जो सिर्फ primitive type ranges के साथ ही use कि जाती है। 

Primitive Type Ranges

Class types के अलावा आप kotlin में available primitive types जैसे की integer, long और char आदि की भी ranges define कर सकते है। Primitive types की range define करना बहुत आसान है।

Comparable types के लिए use किये जाने वाले functions primitive types के साथ operators के रूप में use किये जाते है।

Integral type ranges को भी अलग से types के द्वारा represent किया गया है।

  • IntRange – Integer ranges के लिए। 
  • LongRange – Long numbers ranges के लिए। 
  • CharRange – Character ranges के लिए (a..z या A..Z)

Can Be Iterated Over

Primitive type ranges के बारे में जो सबसे महत्वपूर्ण बात है वह यह है की primitive type ranges को iterate किया जा सकता है। Primitive type ranges को for loop में use कर सकते है। ऐसा comparable types के साथ किया जाना सम्भव नहीं है।

Compiler Automatically Converts to Normal for Loop

जब आप ranges को for loop में use करते है तो compiler उसे identify करके automatically normal for loop में convert कर कर देता है।

Defined Using Double Dot Operator (..)

एक primitive type range को define करने के लिए kotlin में double dot operator का प्रयोग किया जाता है। इस operator को start और end value के बीच define किया जाता है। यह operator rangeTo function के equivalent है। 
उदाहरण के लिए आप एक 1 से 10 की range create करना चाहते है तो ऐसा आप इस प्रकार कर सकते है।

val x = 1..10

Used With in and !in

Ranges के साथ कार्य करने के लिए in और !in operators का प्रयोग किया जाता है। ये operators range में किसी element की membership को दर्शाते है।

इनमें in operator ये confirm किया जाता है की कोई element range में है। जब कोई element range में होता है तो true return किया जाता है नहीं तो false return किया जाता है।

और !in operator द्वारा यह confirm किया जाता है की कोई element range में नहीं है। जब कोई element range में नहीं होता है तो true return किया जाता है और जब element range में available होता है तो false return किया जाता है।

उदाहरण के लिए किसी दूसरी programming language में 1 से 10 तक loop चलाने के लिए आपको इस प्रकार code लिखना होगा।

for(i=1;i<=10;i++)
{
     print(i)
}

ऊपर दिए गए code में 1 से 10 तक की range में loop चलाया गया है और हर बार i को increase किया गया है। Condition के द्वारा हर iteration में यह check किया गया है की i available है या नहीं। Loop के अंदर i को print किया गया है।

ऊपर दिए गए code को ranges की मदद से आप kotlin में इस प्रकार define कर सकते है।

for(i in 1..10)
{
    print(i)
}

Step 

एक range में दो elements के बीच के difference को step द्वारा measure किया जाता है। Default step 1 ही होता है। उदाहरण के लिए ऊपर दिए गए उदाहरण में 1..10 तक की range में step 1 है। Range के हर element को one by one i से match किया गया है।

लेकिन आप अपनी आवश्यकतानुसार भी step को set कर सकते है। इसके लिए step() function का प्रयोग किया जाता है। इस function को range के बाद define किया जाता है। Function के नाम के बाद integer में step को define किया जाता है।

यदि आप 1 से 10 तक की range में सिर्फ even numbers को print करना चाहते है तो इसके लिए आपको step 2 set करना होगा।

for(i in 1..10 step 2)
{
   print(i)
}  

Reverse Iteration

किसी range को reverse में iterate करने के लिए downTo() function का प्रयोग किया जाता है। इस function को range के बाद define किया जाता है। इसके बाद वह element define किया जाता है जँहा तक आप iterate करना चाहते है। 

for(i in 1..10 downTo 1)
{
   print(i)
}

until()

आप एक ऐसी range भी define कर सकते है जिसमें end element को include ना किया जाये। इसके लिए until() function का प्रयोग किया जाता है।

for(i in 1 until 10)
{
   print(i)
}

ऊपर दिए गए उदाहरण में range 1 से 10 है लेकिन 10 को include नहीं किया गया है।

Previous: Kotlin Collections
Next: Kotlin Annotations

Kotlin in Hindi : Delegation

  • Introduction to kotlin delegation in Hindi
  • kotlin delegation by keyword in Hindi
  • Example of kotlin delegation in Hindi

Introduction to Kotlin Delegation

Delegation का concept कई modern programming languages जैसे की C# आदि में introduce किया गया है। लेकिन सभी language इसे अलग अलग तरह से implement करती है।

सभी languages delegation को एक feature की तरह implement नहीं करती है। ऐसी languages में delegation implement करने के लिए आपको एक delegation pattern design करना होता है जिसके लिए boilerplate code की आवश्यकता होती है।

जब आप किसी special feature को implement करने के लिए code template लिखते है तो वह boilerplate code कहलाता है। यह extra code होता है इससे program एक दुविधा भरे वन में तब्दील हो जाता है।

Kotlin Has Native Support For Delegation

दूसरी programming languages के विपरीत kotlin delegation के लिए native support provide करती है। Kotlin में delegation को language feature के रूप में implement किया गया है। 

Kotlin में delegation को implement करने के लिए by keyword को introduce किया गया है। इससे आप यह कह सकते है की kotlin में delegation एक language feature है। 

Passing Implementation to Another Object

Delegation एक mechanism होता है जिसके द्वारा एक class किसी code को खुद ना implement करके किसी दूसरी class को delegate कर देती है। इसके बाद जिस class को delegate किया जाता है वह class उस code का implementation provide करती है जो delegate करने वाली class द्वारा use किया जाता है।

उदाहरण के लिए आप class C को interface I implement करवाना चाहते है। Interface I में बहुत सारे methods available है। आप चाहते है की class C का code clean रहे।

Interface I
{
     //methods of interface
}

class C : I by D   //delegating implementation to class D
{
    //methods of class C
    //call methods of interface I from class D
}

class D: I
{
    //Implementation of methods of Interface I
    //also have methods from different interface
}

ऐसे में आप interface I के implementation को किसी दूसरी class D को delegate कर सकते है और उस class में उन सभी methods को implement कर सकते है। इसके बाद जरुरत पढ़ने पर class C में उन methods को normally call किया जा सकता है।

Alternative to Inheritance

Delegation को inheritance के विकल्प के रूप में देखा जाता है। जिस प्रकार inheritance से एक class दूसरी class के methods को use करती है। उसी प्रकार delegation में भी एक class दूसरी class के methods को use करती है। 

यँहा पर फर्क सिर्फ इतना है की वो methods class के ना हो कर एक interface के होते है और केवल उस class से वे ही methods call होते है जो interface में define किये गए है। उस class के बाकी methods को use नहीं किया जा सकता है।

Delegation inheritance से बेहतरीन होता है। क्योंकि delegation आपको run time flexibility provide करता है। एक interface को कई अलग अलग प्रकार से implement किया जा सकता है और program run होने के दौरान delegation को change किया जा सकता है और किसी दूसरे implementation को implement किया जा सकता है।

यह flexibility inheritance में available नहीं होती है। Inheritance में एक ही type का implementation होता है। यानि आप वही implementation use करते है जो base class में available होता है।

by Keyword

Kotlin delegation implement करने के लिए आपको by keyword provide करती है। यह keyword उस class को दर्शाता है जिसे आप delegate करना चाहते है।

interface dInterface
{
    //methods of dInterface
}

class delegatingClass : dInterface by delegatedClass   //delegating using by
{
   //methods of delegating class
}

class delegatedClass: dInterface
{
    //implementing dInterface Methods
}

सबसे पहले आप वह class define करते है जो delegate के रूप में कार्य करेगी। इसके बाद आप delegate करने वाली class के नाम के बाद colon लगाकर interface को implement करते है। Interface के नाम के बाद by keyword define किया जाता है। इसके बाद उस class का नाम define किया जाता है जो delegate के रूप में कार्य कर रही है।

Example of Kotlin Delegation

interface dInterface
{
    fun interfaceMessage()
}

class delegatingClass:dInterface by delegatedClass
{
    fun classMessage()
    {
       print(“Hello”)
    }
}

class delegatedClass:dInterface
{
    fun interfaceMessage()
    {
        print(“Hi”)
    }
}

fun main(args: Array<String>)
{
    val obj = delegatingClass()
   
    obj.interfaceMessage()
    obj.classMessage()
}