কোটলিন প্রোগ্রামিং ভাষা শিখুন

কোটলিন একটি প্রোগ্রামিং ভাষা যা সর্বত্র অ্যান্ড্রয়েড ডেভেলপারদের দ্বারা ব্যাপকভাবে ব্যবহৃত হয়। এই বিষয়টি আপনাকে দ্রুত চালু করার জন্য একটি কোটলিন ক্র্যাশ-কোর্স হিসাবে কাজ করে।

পরিবর্তনশীল ঘোষণা

কোটলিন ভেরিয়েবল ঘোষণা করতে দুটি ভিন্ন কীওয়ার্ড ব্যবহার করে: val এবং var

  • একটি ভেরিয়েবলের জন্য val ব্যবহার করুন যার মান কখনই পরিবর্তিত হয় না। আপনি val ব্যবহার করে ঘোষিত একটি ভেরিয়েবলে একটি মান পুনরায় বরাদ্দ করতে পারবেন না।
  • একটি ভেরিয়েবলের জন্য var ব্যবহার করুন যার মান পরিবর্তন হতে পারে।

নীচের উদাহরণে, count হল Int টাইপের একটি ভেরিয়েবল যা 10 এর প্রাথমিক মান নির্ধারণ করা হয়েছে:

var count: Int = 10

Int হল একটি টাইপ যা একটি পূর্ণসংখ্যার প্রতিনিধিত্ব করে, অনেকগুলি সংখ্যাসূচক প্রকারের মধ্যে একটি যা কোটলিনে উপস্থাপন করা যেতে পারে। অন্যান্য ভাষার মতো, আপনি আপনার সংখ্যাসূচক ডেটার উপর নির্ভর করে Byte , Short , Long , Float এবং Double ব্যবহার করতে পারেন।

var কীওয়ার্ডের অর্থ হল আপনি প্রয়োজন অনুযায়ী count জন্য মানগুলি পুনরায় বরাদ্দ করতে পারেন। উদাহরণস্বরূপ, আপনি count মান 10 থেকে 15 পরিবর্তন করতে পারেন:

var count: Int = 10
count = 15

কিছু মান পরিবর্তন করা হয় না, যদিও. languageName নামক একটি String বিবেচনা করুন। আপনি যদি নিশ্চিত করতে চান যে languageName সর্বদা "Kotlin" এর একটি মান ধারণ করে, তাহলে আপনি val কীওয়ার্ড ব্যবহার করে languageName ঘোষণা করতে পারেন:

val languageName: String = "Kotlin"

এই কীওয়ার্ডগুলি আপনাকে কী পরিবর্তন করা যেতে পারে সে সম্পর্কে স্পষ্ট হতে দেয়। প্রয়োজন অনুযায়ী আপনার সুবিধার জন্য তাদের ব্যবহার করুন. যদি একটি পরিবর্তনশীল রেফারেন্স পুনরায় বরাদ্দযোগ্য হতে হবে, তাহলে এটিকে var হিসাবে ঘোষণা করুন। অন্যথায়, val ব্যবহার করুন।

অনুমান টাইপ করুন

পূর্ববর্তী উদাহরণটি অব্যাহত রেখে, আপনি যখন languageName এ একটি প্রাথমিক মান বরাদ্দ করেন, Kotlin কম্পাইলার নির্ধারিত মানের প্রকারের উপর ভিত্তি করে ধরনটি অনুমান করতে পারে।

যেহেতু "Kotlin" এর মান String টাইপের, তাই কম্পাইলার অনুমান করে যে languageName একটি String । নোট করুন যে কোটলিন একটি স্ট্যাটিকালি-টাইপ করা ভাষা। এর মানে হল যে টাইপটি কম্পাইলের সময়ে সমাধান করা হয় এবং কখনই পরিবর্তন হয় না।

নিম্নলিখিত উদাহরণে, languageName একটি String হিসাবে অনুমান করা হয়েছে, তাই আপনি String ক্লাসের অংশ নয় এমন কোনো ফাংশনকে কল করতে পারবেন না:

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()

// Fails to compile
languageName.inc()

toUpperCase() একটি ফাংশন যা শুধুমাত্র String টাইপের ভেরিয়েবলে কল করা যায়। যেহেতু Kotlin কম্পাইলার একটি String হিসাবে languageName অনুমান করেছে, আপনি নিরাপদে toUpperCase() কল করতে পারেন। inc() , তবে, একটি Int অপারেটর ফাংশন, তাই এটি একটি String এ কল করা যাবে না। টাইপ ইনফারেন্সে কোটলিনের পদ্ধতি আপনাকে সংক্ষিপ্ততা এবং টাইপ-নিরাপত্তা উভয়ই দেয়।

শূন্য নিরাপত্তা

কিছু ভাষায়, একটি রেফারেন্স টাইপ ভেরিয়েবল একটি প্রাথমিক সুস্পষ্ট মান প্রদান না করে ঘোষণা করা যেতে পারে। এই ক্ষেত্রে, ভেরিয়েবলে সাধারণত একটি শূন্য মান থাকে। Kotlin ভেরিয়েবল ডিফল্টরূপে নাল মান ধরে রাখতে পারে না। এর মানে হল নিম্নলিখিত স্নিপেটটি অবৈধ:

// Fails to compile
val languageName: String = null

একটি নাল মান ধরে রাখার জন্য একটি ভেরিয়েবলের জন্য, এটি অবশ্যই একটি বাতিলযোগ্য ধরনের হতে হবে। আপনি একটি ভেরিয়েবলের সাথে এর প্রকার প্রত্যয় দিয়ে নালযোগ্য হিসাবে নির্দিষ্ট করতে পারেন ? , নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

val languageName: String? = null

একটি String? টাইপ করুন, আপনি languageName একটি String মান বা null বরাদ্দ করতে পারেন।

আপনাকে অবশ্যই nullable ভেরিয়েবলগুলিকে সাবধানে পরিচালনা করতে হবে বা একটি ভয়ঙ্কর NullPointerException ঝুঁকি নিতে হবে। জাভাতে, উদাহরণস্বরূপ, যদি আপনি একটি নাল মানের উপর একটি পদ্ধতি চালু করার চেষ্টা করেন, আপনার প্রোগ্রাম ক্র্যাশ হয়।

কোটলিন নালযোগ্য ভেরিয়েবলের সাথে নিরাপদে কাজ করার জন্য অনেকগুলি প্রক্রিয়া সরবরাহ করে। আরও তথ্যের জন্য, অ্যান্ড্রয়েডে সাধারণ কোটলিন নিদর্শন দেখুন: শূন্যতা

শর্তাবলী

কোটলিন শর্তসাপেক্ষ যুক্তি প্রয়োগের জন্য বেশ কয়েকটি প্রক্রিয়া বৈশিষ্ট্যযুক্ত। এর মধ্যে সবচেয়ে সাধারণ হল একটি if-else বিবৃতি । যদি একটি if কীওয়ার্ডের পাশে বন্ধনীতে মোড়ানো একটি অভিব্যক্তি true মূল্যায়ন করে, তাহলে সেই শাখার মধ্যে কোডটি (অর্থাৎ অবিলম্বে অনুসরণ করা কোড যা কোঁকড়া বন্ধনীতে মোড়ানো হয়) কার্যকর করা হয়। অন্যথায়, else শাখার মধ্যে কোডটি কার্যকর করা হয়।

if (count == 42) {
    println("I have the answer.")
} else {
    println("The answer eludes me.")
}

আপনি else if ব্যবহার করে একাধিক শর্ত উপস্থাপন করতে পারেন। এটি আপনাকে একটি একক শর্তসাপেক্ষ বিবৃতির মধ্যে আরও দানাদার, জটিল যুক্তি উপস্থাপন করতে দেয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

শর্তযুক্ত বিবৃতি রাষ্ট্রীয় যুক্তি উপস্থাপনের জন্য উপযোগী, কিন্তু আপনি তাদের লেখার সময় নিজেকে পুনরাবৃত্তি করতে পারেন। উপরের উদাহরণে, আপনি প্রতিটি শাখায় একটি String মুদ্রণ করুন। এই পুনরাবৃত্তি এড়াতে, কোটলিন শর্তসাপেক্ষ অভিব্যক্তি প্রদান করে। শেষ উদাহরণটি নিম্নরূপ পুনর্লিখন করা যেতে পারে:

val answerString: String = if (count == 42) {
    "I have the answer."
} else if (count > 35) {
    "The answer is close."
} else {
    "The answer eludes me."
}

println(answerString)

অন্তর্নিহিতভাবে, প্রতিটি শর্তসাপেক্ষ শাখা তার চূড়ান্ত লাইনে অভিব্যক্তির ফলাফল প্রদান করে, তাই আপনাকে return কীওয়ার্ড ব্যবহার করতে হবে না। কারণ তিনটি শাখার ফলাফল String টাইপের, if-else এক্সপ্রেশনের ফলাফলও String টাইপ। এই উদাহরণে, if-else এক্সপ্রেশনের ফলাফল থেকে answerString একটি প্রাথমিক মান নির্ধারণ করা হয়েছে। টাইপ ইনফারেন্সটি answerString এর জন্য স্পষ্ট টাইপ ঘোষণা বাদ দিতে ব্যবহার করা যেতে পারে, কিন্তু স্পষ্টতার জন্য এটি অন্তর্ভুক্ত করা প্রায়শই একটি ভাল ধারণা।

আপনার কন্ডিশনাল স্টেটমেন্টের জটিলতা বাড়ার সাথে সাথে, আপনি আপনার if-else এক্সপ্রেশনটিকে when expression দিয়ে প্রতিস্থাপন করার কথা বিবেচনা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}

println(answerString)

একটি when এক্সপ্রেশনের প্রতিটি শাখা একটি শর্ত, একটি তীর ( -> ), এবং একটি ফলাফল দ্বারা উপস্থাপিত হয়। যদি তীরের বাম দিকের শর্তটি সত্যে মূল্যায়ন করা হয়, তাহলে ডানদিকের অভিব্যক্তির ফলাফলটি ফেরত দেওয়া হবে। উল্লেখ্য যে মৃত্যুদন্ড এক শাখা থেকে অন্য শাখায় পড়ে না। when এক্সপ্রেশন উদাহরণের কোডটি আগের উদাহরণের সাথে কার্যকরী-সমতুল্য কিন্তু তর্কযোগ্যভাবে পড়া সহজ।

কোটলিনের শর্তাবলী তার আরও শক্তিশালী বৈশিষ্ট্যগুলির একটি, স্মার্ট কাস্টিংকে হাইলাইট করে। নালযোগ্য মানগুলির সাথে কাজ করার জন্য নিরাপদ-কল অপারেটর বা নট-নাল অ্যাসারশন অপারেটর ব্যবহার করার পরিবর্তে, আপনি পরিবর্তে একটি শর্তসাপেক্ষ বিবৃতি ব্যবহার করে একটি ভেরিয়েবলে একটি নাল মানের রেফারেন্স রয়েছে কিনা তা পরীক্ষা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

val languageName: String? = null
if (languageName != null) {
    // No need to write languageName?.toUpperCase()
    println(languageName.toUpperCase())
}

শর্তসাপেক্ষ শাখার মধ্যে, languageName অ-নূলযোগ্য হিসাবে গণ্য করা যেতে পারে। Kotlin যথেষ্ট স্মার্ট যে শাখাটি কার্যকর করার শর্ত হল যে languageName একটি নাল মান ধারণ করে না, তাই আপনাকে সেই শাখার মধ্যে languageName বাতিলযোগ্য হিসাবে বিবেচনা করতে হবে না। এই স্মার্ট কাস্টিংটি নাল চেক, টাইপ চেক বা চুক্তি সন্তুষ্ট করে এমন যেকোনো শর্তের জন্য কাজ করে।

ফাংশন

আপনি একটি ফাংশনে এক বা একাধিক অভিব্যক্তি গ্রুপ করতে পারেন। আপনার ফলাফলের প্রয়োজন হলে প্রতিবার একই সিরিজের অভিব্যক্তি পুনরাবৃত্তি করার পরিবর্তে, আপনি একটি ফাংশনে অভিব্যক্তিগুলিকে মোড়ানো করতে পারেন এবং পরিবর্তে সেই ফাংশনটিকে কল করতে পারেন।

একটি ফাংশন ঘোষণা করতে, ফাংশনের নাম অনুসরণ করে fun কীওয়ার্ড ব্যবহার করুন। এরপরে, আপনার ফাংশন যে ধরনের ইনপুট নেয় তা নির্ধারণ করুন, যদি থাকে, এবং এটি যে ধরনের আউটপুট দেয় তা ঘোষণা করুন। একটি ফাংশনের বডি হল যেখানে আপনি এক্সপ্রেশনগুলিকে সংজ্ঞায়িত করেন যেগুলিকে যখন আপনার ফাংশন আহ্বান করা হয় তখন বলা হয়৷

পূর্ববর্তী উদাহরণগুলির উপর ভিত্তি করে, এখানে একটি সম্পূর্ণ কোটলিন ফাংশন রয়েছে:

fun generateAnswerString(): String {
    val answerString = if (count == 42) {
        "I have the answer."
    } else {
        "The answer eludes me"
    }

    return answerString
}

উপরের উদাহরণের ফাংশনটির নাম generateAnswerString আছে। এটা কোন ইনপুট লাগে না. এটি String টাইপের ফলাফল আউটপুট করে। একটি ফাংশন কল করতে, তার নাম ব্যবহার করুন, আমন্ত্রণ অপারেটর ( () ) দ্বারা অনুসরণ করুন। নীচের উদাহরণে, generateAnswerString() থেকে ফলাফলের সাথে answerString ভেরিয়েবলটি আরম্ভ করা হয়েছে।

val answerString = generateAnswerString()

ফাংশনগুলি আর্গুমেন্টগুলিকে ইনপুট হিসাবে নিতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }

    return answerString
}

একটি ফাংশন ঘোষণা করার সময়, আপনি যেকোনো সংখ্যক আর্গুমেন্ট এবং তাদের প্রকার উল্লেখ করতে পারেন। উপরের উদাহরণে, generateAnswerString() Int টাইপের countThreshold নামে একটি আর্গুমেন্ট নেয়। ফাংশনের মধ্যে, আপনি আর্গুমেন্টের নাম ব্যবহার করে উল্লেখ করতে পারেন।

এই ফাংশনটি কল করার সময়, আপনাকে অবশ্যই ফাংশন কলের বন্ধনীর মধ্যে একটি আর্গুমেন্ট অন্তর্ভুক্ত করতে হবে:

val answerString = generateAnswerString(42)

ফাংশন ঘোষণা সরলীকরণ

generateAnswerString() একটি মোটামুটি সহজ ফাংশন। ফাংশন একটি পরিবর্তনশীল ঘোষণা করে এবং তারপর অবিলম্বে ফিরে আসে। যখন একটি ফাংশন থেকে একটি একক অভিব্যক্তির ফলাফল ফেরত দেওয়া হয়, আপনি ফাংশনে থাকা if-else এক্সপ্রেশনের ফলাফল সরাসরি ফিরিয়ে দিয়ে একটি স্থানীয় ভেরিয়েবল ঘোষণা করা এড়িয়ে যেতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

fun generateAnswerString(countThreshold: Int): String {
    return if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
}

আপনি অ্যাসাইনমেন্ট অপারেটরের সাথে রিটার্ন কীওয়ার্ড প্রতিস্থাপন করতে পারেন:

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
    }

বেনামী ফাংশন

প্রতিটি ফাংশন একটি নামের প্রয়োজন হয় না. কিছু ফাংশন আরও সরাসরি তাদের ইনপুট এবং আউটপুট দ্বারা চিহ্নিত করা হয়। এই ফাংশনগুলিকে বেনামী ফাংশন বলা হয়। আপনি একটি বেনামী ফাংশনের একটি রেফারেন্স রাখতে পারেন, এই রেফারেন্সটি ব্যবহার করে বেনামী ফাংশনটিকে পরে কল করতে। অন্যান্য রেফারেন্স প্রকারের মতো আপনি আপনার আবেদনের চারপাশে রেফারেন্সও পাস করতে পারেন।

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

নামযুক্ত ফাংশনের মতো, বেনামী ফাংশনে যে কোনও সংখ্যক অভিব্যক্তি থাকতে পারে। ফাংশনের প্রত্যাবর্তিত মান চূড়ান্ত অভিব্যক্তির ফলাফল।

উপরের উদাহরণে, stringLengthFunc একটি বেনামী ফাংশনের একটি রেফারেন্স রয়েছে যা একটি String ইনপুট হিসাবে নেয় এবং Int টাইপের আউটপুট হিসাবে ইনপুট String দৈর্ঘ্য প্রদান করে। সেই কারণে, ফাংশনের ধরনটিকে (String) -> Int হিসাবে চিহ্নিত করা হয়। এই কোড ফাংশন আহ্বান করে না, যদিও. ফাংশনের ফলাফল পুনরুদ্ধার করার জন্য, আপনাকে অবশ্যই একটি নামযুক্ত ফাংশনের মতো এটিকে আহ্বান করতে হবে। stringLengthFunc কল করার সময় আপনাকে অবশ্যই একটি String সরবরাহ করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

উচ্চ ক্রম ফাংশন

একটি ফাংশন একটি যুক্তি হিসাবে অন্য ফাংশন নিতে পারে. যে ফাংশনগুলি অন্য ফাংশনগুলিকে আর্গুমেন্ট হিসাবে ব্যবহার করে সেগুলিকে উচ্চ-ক্রম ফাংশন বলে। এই প্যাটার্নটি একইভাবে উপাদানগুলির মধ্যে যোগাযোগের জন্য দরকারী যেভাবে আপনি জাভাতে একটি কলব্যাক ইন্টারফেস ব্যবহার করতে পারেন।

এখানে একটি উচ্চ-ক্রম ফাংশনের একটি উদাহরণ:

fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}

stringMapper() ফাংশনটি একটি ফাংশনের সাথে একটি String নেয় যা একটি String থেকে একটি Int মান প্রাপ্ত করে যা আপনি এতে পাস করেন।

আপনি একটি String পাস করে stringMapper() কল করতে পারেন এবং একটি ফাংশন যা অন্য ইনপুট প্যারামিটারকে সন্তুষ্ট করে, যেমন একটি ফাংশন যা একটি String ইনপুট হিসাবে নেয় এবং একটি Int আউটপুট করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

stringMapper("Android", { input ->
    input.length
})

যদি বেনামী ফাংশনটি একটি ফাংশনে সংজ্ঞায়িত শেষ প্যারামিটার হয়, তাহলে আপনি এটিকে ফাংশনটি শুরু করতে ব্যবহৃত বন্ধনীর বাইরে পাস করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

stringMapper("Android") { input ->
    input.length
}

বেনামী ফাংশন কোটলিন স্ট্যান্ডার্ড লাইব্রেরি জুড়ে পাওয়া যাবে। আরও তথ্যের জন্য, হায়ার-অর্ডার ফাংশন এবং ল্যাম্বডাস দেখুন।

ক্লাস

এখন পর্যন্ত উল্লিখিত সমস্ত প্রকারগুলি কোটলিন প্রোগ্রামিং ভাষায় নির্মিত। আপনি যদি আপনার নিজস্ব কাস্টম প্রকার যোগ করতে চান, তাহলে আপনি class কীওয়ার্ড ব্যবহার করে একটি ক্লাস সংজ্ঞায়িত করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

class Car

বৈশিষ্ট্য

ক্লাস বৈশিষ্ট্য ব্যবহার করে রাষ্ট্র প্রতিনিধিত্ব করে। একটি সম্পত্তি একটি শ্রেণী-স্তরের পরিবর্তনশীল যা একটি গেটার, একটি সেটার এবং একটি ব্যাকিং ক্ষেত্র অন্তর্ভুক্ত করতে পারে। যেহেতু একটি গাড়ি চালানোর জন্য চাকার প্রয়োজন, আপনি Car সম্পত্তি হিসাবে Wheel বস্তুর একটি তালিকা যোগ করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

class Car {
    val wheels = listOf<Wheel>()
}

নোট করুন যে wheels একটি public val , যার অর্থ হল Car ক্লাসের বাইরে থেকে wheels অ্যাক্সেস করা যেতে পারে এবং এটি পুনরায় বরাদ্দ করা যাবে না। আপনি যদি Car এর একটি উদাহরণ পেতে চান তবে আপনাকে প্রথমে এর কন্সট্রাক্টরকে কল করতে হবে। সেখান থেকে, আপনি এর যে কোনো অ্যাক্সেসযোগ্য বৈশিষ্ট্য অ্যাক্সেস করতে পারেন।

val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car

আপনি যদি আপনার চাকাগুলি কাস্টমাইজ করতে চান তবে আপনি একটি কাস্টম কনস্ট্রাক্টরকে সংজ্ঞায়িত করতে পারেন যা নির্দিষ্ট করে যে কীভাবে আপনার ক্লাসের বৈশিষ্ট্যগুলি শুরু করা হয়:

class Car(val wheels: List<Wheel>)

উপরের উদাহরণে, ক্লাস কনস্ট্রাক্টর একটি List<Wheel> কনস্ট্রাক্টর আর্গুমেন্ট হিসেবে নেয় এবং সেই আর্গুমেন্টটি ব্যবহার করে তার wheels বৈশিষ্ট্য শুরু করে।

ক্লাস ফাংশন এবং এনক্যাপসুলেশন

ক্লাস আচরণ মডেল করার জন্য ফাংশন ব্যবহার করে। ফাংশনগুলি স্টেট পরিবর্তন করতে পারে, আপনাকে শুধুমাত্র সেই ডেটা প্রকাশ করতে সাহায্য করে যা আপনি প্রকাশ করতে চান। এই অ্যাক্সেস কন্ট্রোলটি এনক্যাপসুলেশন নামে পরিচিত একটি বৃহত্তর অবজেক্ট-ওরিয়েন্টেড ধারণার অংশ।

নিম্নলিখিত উদাহরণে, doorLock প্রপার্টি Car ক্লাসের বাইরের যেকোনো কিছু থেকে ব্যক্তিগত রাখা হয়। গাড়িটি আনলক করতে, আপনাকে অবশ্যই একটি বৈধ কী দিয়ে unlockDoor() ফাংশনটি কল করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

আপনি যদি একটি সম্পত্তির রেফারেন্স কিভাবে কাস্টমাইজ করতে চান, আপনি একটি কাস্টম গেটার এবং সেটার প্রদান করতে পারেন। উদাহরণ স্বরূপ, আপনি যদি কোনো প্রপার্টির গেটারকে সেটির সেটারে অ্যাক্সেস সীমাবদ্ধ করার সময় প্রকাশ করতে চান, আপনি সেই সেটারটিকে private হিসাবে মনোনীত করতে পারেন:

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    var gallonsOfFuelInTank: Int = 15
        private set

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

বৈশিষ্ট্য এবং ফাংশনগুলির সংমিশ্রণে, আপনি এমন ক্লাস তৈরি করতে পারেন যা সমস্ত ধরণের অবজেক্টের মডেল করে।

ইন্টারঅপারেবিলিটি

কোটলিনের সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলির মধ্যে একটি হল জাভার সাথে এর তরল আন্তঃক্রিয়াশীলতা। যেহেতু Kotlin কোড JVM বাইটকোডে কম্পাইল করে, আপনার Kotlin কোড সরাসরি Java কোডে কল করতে পারে এবং এর বিপরীতে। এর মানে হল যে আপনি বিদ্যমান জাভা লাইব্রেরিগুলি সরাসরি কোটলিন থেকে ব্যবহার করতে পারেন। অধিকন্তু, বেশিরভাগ অ্যান্ড্রয়েড এপিআই জাভাতে লেখা, এবং আপনি সরাসরি কোটলিন থেকে তাদের কল করতে পারেন।

পরবর্তী পদক্ষেপ

কোটলিন ক্রমবর্ধমান সমর্থন এবং গতির সাথে একটি নমনীয়, বাস্তববাদী ভাষা। আপনি যদি এখনও না করে থাকেন তবে আমরা আপনাকে এটি চেষ্টা করার জন্য উত্সাহিত করি। পরবর্তী পদক্ষেপের জন্য, আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলিতে সাধারণ কোটলিন নিদর্শনগুলি কীভাবে প্রয়োগ করবেন তার নির্দেশিকা সহ অফিসিয়াল কোটলিন ডকুমেন্টেশন দেখুন৷