কোটলিনে আপনি যদি কনস্ট্রাক্টরের অভ্যন্তরে বা শ্রেণিবদ্ধের শীর্ষে কোনও শ্রেণীর সম্পত্তি শুরু করতে না চান তবে আপনার কাছে মূলত এই দুটি বিকল্প রয়েছে (ভাষার রেফারেন্স থেকে):
অলস () এমন একটি ফাংশন যা ল্যাম্বডা নেয় এবং অলসতার একটি উদাহরণ দেয় যা একটি অলস সম্পত্তি বাস্তবায়নের জন্য একটি প্রতিনিধি হিসাবে কাজ করতে পারে: পাওয়ার জন্য প্রথম কল () ল্যাম্বডাকে অলসতায় পাস করেছে () এবং ফলাফলটি মনে রাখে, পরবর্তী কলগুলি () সহজভাবে স্মরণ করা ফলাফল ফিরে পেতে।
উদাহরণ
public class Hello { val myLazyString: String by lazy { "Hello" } }
প্রথম কল এবং subquential কল, যেখানেই থাকুন না কেন এটা করা হয়, তাই myLazyString ফিরে আসবে "হ্যালো"
সাধারণত, নন-নাল টাইপ হিসাবে ঘোষিত বৈশিষ্ট্যগুলি কনস্ট্রাক্টরে অবশ্যই শুরু করতে হবে। তবে প্রায়শই এটি সুবিধাজনক নয়। উদাহরণস্বরূপ, নির্ভরতা ইনজেকশনের মাধ্যমে, বা ইউনিট পরীক্ষার সেটআপ পদ্ধতিতে বৈশিষ্ট্যগুলি আরম্ভ করা যেতে পারে। এই ক্ষেত্রে, আপনি কনস্ট্রাক্টরে একটি নন-নাল ইনিশিয়ালাইজার সরবরাহ করতে পারবেন না, তবে আপনি কোনও শ্রেণীর শরীরে অভ্যন্তরীণ সম্পত্তি উল্লেখ করার সময় নাল চেকগুলি এড়াতে চান।
এই কেসটি পরিচালনা করতে আপনি ল্যাটিনাইট সংশোধক দিয়ে সম্পত্তি চিহ্নিত করতে পারেন:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
সংশোধকটি কেবলমাত্র শ্রেণীর দেহের অভ্যন্তরে ঘোষিত ভ্যার বৈশিষ্ট্যগুলিতে ব্যবহার করা যেতে পারে (প্রাথমিক নির্মাতার মধ্যে নয়) এবং কেবলমাত্র যখন সম্পত্তিটির নিজস্ব কাস্টম বা সেটার না থাকে। সম্পত্তির প্রকারটি অবশ্যই শূন্য হওয়া উচিত এবং এটি কোনও আদিম ধরণের হওয়া উচিত নয়।
সুতরাং, এই দুটি বিকল্পের মধ্যে কীভাবে সঠিকভাবে চয়ন করবেন, যেহেতু উভয়ই একই সমস্যা সমাধান করতে পারে?
lateinit
সেটারের দৃশ্যমানতার সাথে এর ব্যাকিং ফিল্ডটি প্রকাশ করে যাতে কোটলিন থেকে এবং জাভা থেকে সম্পত্তিটি অ্যাক্সেস করার উপায়গুলি আলাদা are এবং জাভা কোড থেকে এই সম্পত্তিটিnull
কোটলিনে কোনও চেক ছাড়াই সেট করা যেতে পারে । সুতরাংlateinit
অলস সূচনা করার জন্য নয় তবে প্রাথমিকভাবে কোটলিন কোড থেকে প্রয়োজনীয় নয়।