একটি "ল্যাটিনাইট" পরিবর্তনশীল আরম্ভ করা হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


428

আমি ভাবছি যদি lateinitভেরিয়েবলটি আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কিনা । উদাহরণ স্বরূপ:

class Foo() {

    private lateinit var myFile: File

    fun bar(path: String?) {
        path?.let { myFile = File(it) }
    }

    fun bar2() {
        myFile.whateverMethod()
        // May crash since I don't know whether myFile has been initialized
    }
}

3
আপনার যা প্রয়োজন তা হ'ল সম্পত্তিটি পরিবর্তনযোগ্য (পরিবর্তনের প্রকারে File?) করা এবং কেবল এটির পরিবর্তে নাল কিনা তা পরীক্ষা করা?
মার্সিন কোজিস্কি

1
ঠিক আছে, আমি আসলে এটি চেষ্টা করেছি এবং এটি কৌশলটি সম্পাদন করবে, তবে আমাকে allSeriesভারতে সম্পাদনা করতে হবে seriesDir?.listFiles()?.map { it.name }?.toTypedArray(), যা খুব "সুন্দর" নয়
ম্যাথিউ হ্যানি

1
আপনি একটি সাধারণ পুরানো নাল চেক করতে পারেন এবং স্মার্ট কাস্ট এটি এটিকে সুন্দর করে তুলবে। if (seriesDir != null) { allSeries = seriesDir.listFiles().map { it.name }.toTypedArray() }
মার্সিন কোজিস্কি

দয়া করে আরও আপ টু ডেট উত্তর
18-25

উত্তর:


977

lateinitকোটলিন ১.২ এর একটি উন্নতি রয়েছে যা lateinitসরাসরি পরিবর্তনশীলের সূচনা অবস্থা পরীক্ষা করতে দেয় :

lateinit var file: File    

if (this::file.isInitialized) { ... }

জেটব্রেইনস ব্লগ বা কেইইপি প্রস্তাবনাতে ঘোষণাপত্রটি দেখুন ।

আপডেট: কোটলিন 1.2 প্রকাশিত হয়েছে। আপনি lateinitএখানে উন্নতিগুলি পেতে পারেন :


3
@ ফের.মারিনো: আচ্ছা, কোটলিন ১.২ আসলে আপনাকে lateinitস্থানীয় ভেরিয়েবলের জন্যও ব্যবহার করতে দেয় , দেখুন কোটলিংলং.আর্গ
ডকস /

9
এই :: ল্যাটিনিটভিয়ার.আইসিসিটালাইজড
vihkat

17
::আগে মানে কি file?
মালভিন্দর সিং

5
@ মালভীদারসিংহ এটি একটি সদস্য রেফারেন্স বা শ্রেণি রেফারেন্স তৈরি করে।
notGeek

5
প্রেমে এখন কোটলিন
নাভিদ আহমেদ

46

.isInitializedসম্পত্তি ব্যবহার করে যে কোনও ল্যাটিনিট ভেরিয়েবলের আরম্ভের অবস্থাটি পরীক্ষা করতে পারে।

if(::file.isInitialized){
    //File is initialized
}else{
    //File is not initialized
}

এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন। - পর্যালোচনা থেকে
gfor301

2
@ gfor301 এটি অবশ্যই পরীক্ষার জন্য ব্যবহৃত হবে।
নিখিল কাটখিয়ে

39

এটি ব্যবহার করার চেষ্টা করুন এবং UninitializedPropertyAccessExceptionএটি আরম্ভ করা না হলে আপনি একটি পাবেন ।

lateinitক্ষেত্রগুলি নির্মাণের পরে ক্ষেত্রের সূচনা হয় এমন ক্ষেত্রে বিশেষত, তবে প্রকৃত ব্যবহারের আগে (একটি মডেল যা বেশিরভাগ ইনজেকশন ফ্রেমওয়ার্ক ব্যবহার করে)। এটি না হলে আপনার ব্যবহারের ক্ষেত্রে lateinitসঠিক পছন্দ নাও হতে পারে।

সম্পাদনা: আপনি যা কিছু করতে চান তার ভিত্তিতে এটি আরও ভাল কাজ করবে:

val chosenFile = SimpleObjectProperty<File?>
val button: Button

// Disables the button if chosenFile.get() is null
button.disableProperty.bind(chosenFile.isNull())

আমার একটি জাভাএফএক্স অ্যাপ্লিকেশন রয়েছে এবং আমার কাছে একটি বোতাম রয়েছে যা ভেরিয়েবল (যা lateinit) শুরু না করা অবধি সর্বদা অক্ষম থাকবে । অন্য কথায়: আমি যতক্ষণ না ভেরিয়েবলটি আরম্ভ করা হয়নি ততক্ষণ বোতামটি অক্ষম করা উচিত। এটি করার কোনও ভাল উপায় আছে?
ম্যাথিউ হ্যানি

@ ম্যাথিউহানি কীভাবে এটি প্রাথমিকভাবে শুরু হবে? আপনি প্রপার্টি গেটার / সেটার এবং সিম্পল বুলিয়ান প্রপার্টিটি দেখতে চাইতে পারেন যা আপনি বোতামটির অক্ষম সম্পত্তিকে আবদ্ধ করতে পারেন
কিসকা

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

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

1
কোটলিংলং.আর্গ / ডকস / রেফারেন্স / x এক্সভেদের উত্তরটি আপ টু ডেট রয়েছে
সার্জ

18

আপনি সহজেই এর মাধ্যমে এটি করতে পারেন:

::variableName.isInitialized

অথবা

this::variableName.isInitialized

তবে আপনি যদি শ্রোতা বা অভ্যন্তর শ্রেণীর ভিতরে থাকেন তবে এটি করুন:

this@YourClassName::variableName.isInitialized

দ্রষ্টব্য: উপরের বিবৃতিগুলি ঠিক একইভাবে কাজ করে যদি আপনি সেগুলি একই ফাইল (একই শ্রেণি বা অভ্যন্তরীণ শ্রেণিতে) লিখতে থাকেন যেখানে ভেরিয়েবলটি ঘোষিত হয় তবে আপনি অন্য শ্রেণীর ভেরিয়েবলটি পরীক্ষা করতে চান (সুপারক্লাস নয় বা ঘোষিত হিসাবে ঘোষণা করেছেন) এটি কাজ করবে না অন্য ফাইল) , যেমন:

class Test {
    lateinit var str:String
}

আর str শুরু করা হয়েছে কিনা তা পরীক্ষা করতে:

এখানে চিত্র বর্ণনা লিখুন

আমরা এখানে কি করছ ক্ষেত্র অ্যাক্সেস strএর Testমধ্যে বর্গ Test2বর্গ। এবং আমরা পেয়েছি ত্রুটির ব্যাকিংয়ের ক্ষেত্রের ক্ষেত্রটি এই সময়ে অ্যাক্সেসযোগ্য নয়। এই সম্পর্কে ইতিমধ্যে উত্থাপিত একটি প্রশ্ন পরীক্ষা করুন ।


12

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

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}

আমি যখন এই চেকটি অমীমাংসিত রেফারেন্সের মতো একটি ত্রুটি দেয় তখন আমি একটি স্থানীয় আরআর ভেরিয়েবল ব্যবহার করছি
মার্জিন

3

lateinit varকোনও .isInitializedএই সম্পত্তি সম্পর্কিত রেফারেন্স ব্যবহার করে আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করতে :

if (foo::bar.isInitialized) {
    println(foo.bar)
}

এই চেকিংটি কেবলমাত্র সেই বৈশিষ্ট্যগুলির জন্য উপলভ্য যা লেক্সটিকভাবে অ্যাক্সেসযোগ্য, যেমন একই ধরণের বা বাইরের ধরণের যে কোনও একটিতে বা একই ফাইলের শীর্ষ স্তরে ঘোষিত।


1
::আগে মানে কি bar?
মালভিন্দর সিং

@ মালভিন্দর সিং "সদস্যের রেফারেন্স বা একটি শ্রেণি রেফারেন্স তৈরি করেছেন" - কোটলিন ডক
ডিএমনকি

0
kotlin.UninitializedPropertyAccessException: lateinit property clientKeypair has not been initialized

বাইটকোড বলেছেন ... ব্লা ব্লহ ..

public final static synthetic access$getClientKeypair$p(Lcom/takharsh/ecdh/MainActivity;)Ljava/security/KeyPair;

`L0
LINENUMBER 11 L0
ALOAD 0
GETFIELD com/takharsh/ecdh/MainActivity.clientKeypair : Ljava/security/KeyPair;
DUP
IFNONNULL L1
LDC "clientKeypair"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwUninitializedPropertyAccessException (Ljava/lang/String;)V
    L1
ARETURN

L2 স্থানীয়ভাবে $ এই এলকম / তখারশ / ইসিডিএইচ / প্রধান ক্রিয়াকলাপ; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1

কোটলিন একই উদাহরণের অতিরিক্ত স্থানীয় ভেরিয়েবল তৈরি করে এবং এটি বাতিল হয় কিনা তা পরীক্ষা করে যদি নাল হয় তবে 'थ्रोইইনিটালাইজডপ্রোপার্টিএ্যাকসেসে এক্সসেপশন' নিক্ষেপ করে অন্যথায় স্থানীয় বস্তুটি ফেরত দেয়। উপরের বাইটকোডটি এখানে ব্যাখ্যা করেছেন কোটলিন ১.২০ সাল থেকে এটি আবহাওয়ার চেক করতে দেয় ল্যাটিনিট ভারটি শুরু হয়েছে বা ব্যবহার করা হচ্ছে না.isInitialized

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.