properties - কোটলিন-"অলস দ্বারা" বনাম "ল্যাটিনাইট" ব্যবহার করে সম্পত্তি শুরুকরণ




kotlin (6)

কোটলিনে আপনি যদি কনস্ট্রাক্টরের অভ্যন্তরে বা শ্রেণিবদ্ধের শীর্ষে কোনও শ্রেণীর সম্পত্তি শুরু করতে না চান তবে আপনার কাছে মূলত এই দুটি বিকল্প রয়েছে (ভাষার রেফারেন্স থেকে):

  1. অলস সূচনা

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

উদাহরণ

public class Hello {

   val myLazyString: String by lazy { "Hello" }

}

সুতরাং মাইল্যাজিস্ট্রিং-এ প্রথম কল এবং অনুমিত কলগুলি যেখানেই হোক না কেন "হ্যালো" ফেরত আসবে

  1. দেরী সূচনা

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

এই কেসটি পরিচালনা করতে আপনি ল্যাটিনাইট সংশোধক দিয়ে সম্পত্তি চিহ্নিত করতে পারেন:

public class MyTest {

   lateinit var subject: TestSubject

   @SetUp fun setup() { subject = TestSubject() }

   @Test fun test() { subject.method() }
}

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

সুতরাং, এই দুটি বিকল্পের মধ্যে কীভাবে সঠিকভাবে চয়ন করবেন, যেহেতু উভয়ই একই সমস্যা সমাধান করতে পারে?


আপনি যদি অপরিবর্তনীয় পরিবর্তনশীল ব্যবহার করেন তবে by lazy { ... } বা ভাল দিয়ে সূচনা করা ভাল। এই ক্ষেত্রে আপনি নিশ্চিত হতে পারেন যে এটি যখন প্রয়োজন হয় এবং সর্বদা 1 সময় সর্বদা শুরু করা হবে।

আপনি যদি একটি নন-নাল ভেরিয়েবল চান, তবে এটির মান পরিবর্তন করতে পারে, lateinit var ব্যবহার করুন। অ্যান্ড্রয়েড বিকাশে আপনি পরে এটি onCreate , onResume মতো ইভেন্টগুলিতে শুরু করতে পারেন। সচেতন হোন, আপনি যদি আরআরএসটি অনুরোধটি কল করেন এবং এই পরিবর্তনশীলটি অ্যাক্সেস করেন তবে এটি একটি ব্যতিক্রম হতে পারে UninitializedPropertyAccessException: lateinit property yourVariable has not been initialized , কারণ অনুরোধটি সেই পরিবর্তনশীল আরম্ভের চেয়ে দ্রুত কার্যকর করতে পারে।


খুব সংক্ষিপ্ত এবং সংক্ষিপ্ত উত্তর

ল্যাটিনাইট: এটি নন-নাল বৈশিষ্ট্যগুলি ইদানীং সূচনা করে

অলস প্রারম্ভিককরণের বিপরীতে, ল্যাটিনিট সংকলকটিকে স্বীকৃতি দেয় যে নন-নাল সম্পত্তির মান নির্ধারক পর্যায়ে সাধারণত সঙ্কলনের জন্য সংরক্ষণ করা হয় না।

অলস সূচনা

কোটলিনে অলস-ইনিশিয়ালাইজেশন সম্পাদনযোগ্য পঠনযোগ্য (ভাল) বৈশিষ্ট্যগুলি প্রয়োগ করার সময় অলস দ্বারা খুব কার্যকর হতে পারে।

অলস দ্বারা {... its তার ইনিশিয়ালাইজারটি সম্পাদন করে যেখানে সংজ্ঞায়িত সম্পত্তিটি প্রথমে ব্যবহৃত হয়, এটির ঘোষণা নয় not


যদি আপনি স্প্রিং পাত্রে ব্যবহার করছেন এবং আপনি অ-ননযোগ্য শিমের ক্ষেত্রটি আরম্ভ করতে চান তবে lateinit আরও উপযুক্ত।

    @Autowired
    lateinit var myBean: MyBean

hotkey -র উত্তরের উত্তরে সংযোজন হিসাবে, আমি এখানে অনুশীলনে দু'জনের মধ্যে কীভাবে বেছে নিই:

lateinit বাহ্যিক আরম্ভের জন্য: যখন কোনও পদ্ধতিতে কল করে আপনার মানটি আরম্ভ করার জন্য আপনাকে বাহ্যিক lateinit প্রয়োজন হয়।

যেমন কল করে:

private lateinit var value: MyClass

fun init(externalProperties: Any) {
   value = somethingThatDependsOn(externalProperties)
}

lazy যখন তখন হয় যখন এটি কেবল আপনার অবজেক্টের অভ্যন্তরীণ নির্ভরতা ব্যবহার করে।


ক্রেডিট @ অমিত শেখরকে যায়

lateinit

ল্যাটিনাইট হ'ল দেরীতে ইনিশিয়েশন।

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

উদাহরণ:

public class Test {

  lateinit var mock: Mock

  @SetUp fun setup() {
     mock = Mock()
  }

  @Test fun test() {
     mock.do()
  }
}

অলস

অলস অলস সূচনা হয়।

lazy() এমন একটি ফাংশন যা একটি ল্যাম্বডা নেয় এবং অলসতার একটি উদাহরণ দেয় যা অলস সম্পত্তি বাস্তবায়নের জন্য একটি প্রতিনিধি হিসাবে কাজ করতে পারে: get() প্রথম কল get() লাম্বদা lazy() পাস কার্যকর করে এবং ফলাফল স্মরণ করে, পরবর্তী কলগুলি get() সহজভাবে স্মরণ করা ফলাফল ফিরে get()

উদাহরণ:

public class Example{
  val name: String by lazy { Amit Shekhar }
}

ল্যাটিনাইট বনাম অলস

  1. lateinit

    i) এটিকে পরিবর্তনশীল ভেরিয়েবল [var] সহ ব্যবহার করুন

    lateinit var name: String       //Allowed
    lateinit val name: String       //Not Allowed

    ii) কেবলমাত্র অ-অযোগ্য তথ্য প্রকারের দ্বারা অনুমোদিত

    lateinit var name: String       //Allowed
    lateinit var name: String?      //Not Allowed

    iii) এটি সংকলনের প্রতিশ্রুতি যে ভবিষ্যতে মানটি আরম্ভ করা হবে।

দ্রষ্টব্য : আপনি যদি আরম্ভ না করে ল্যাটিনাইট পরিবর্তনশীল অ্যাক্সেস করার চেষ্টা করেন তবে এটি UnInitializedPropertyAccessException নিক্ষেপ করে।

  1. অলস

    i) অলস সূচনাটি অবজেক্টগুলির অপ্রয়োজনীয় প্রারম্ভিক প্রতিরোধের জন্য ডিজাইন করা হয়েছিল।

    ii) আপনার পরিবর্তনশীলটি ব্যবহার না করা শুরু করা হবে না ized

    iii) এটি একবারেই শুরু করা হয়েছে। পরের বার আপনি যখন এটি ব্যবহার করবেন, আপনি ক্যাশে মেমরি থেকে মান পাবেন।

    iv) এটি থ্রেড নিরাপদ (এটি থ্রেডে আরম্ভ হয় যেখানে এটি প্রথমবার ব্যবহৃত হয় Other অন্যান্য থ্রেডগুলি ক্যাশে সঞ্চিত একই মান ব্যবহার করে)।

    v) ভেরিয়েবলটি ভের বা ভল হতে পারে।

    vi) পরিবর্তনশীল হ্রাসযোগ্য বা অ-পরিবর্তনযোগ্য হতে পারে।





kotlin