কোটলিনে চেক করার সেরা উপায়?


98

আমার কি দ্বিগুণ =, বা ট্রিপল ব্যবহার করা উচিত =?

if(a === null)  {
//do something
}

বা

if(a == null)  {
//do something
}

একইভাবে 'সমান নয়' এর জন্য:

if(a !== null)  {
//do something
}

বা

if(a != null)  {
//do something
}

4
লিঙ্কটি দেখুন: - কোটলিংলং.আর্গ / ডকস
রেফারেন্স

উত্তর:


63

উভয় পন্থা একই বাইকোড তৈরি করে যাতে আপনি যা পছন্দ করতে পারেন তা বেছে নিতে পারেন।


4
। যদি আমি এটা সঠিকভাবে বোঝা তারপর তিনি Kotlin চেক নাল করার সেরা উপায় চাইছে, না যা পদ্ধতির সেরা বাইট-কোড জেনারেট করে @ BenitoBertoli উত্তর সৌন্দর্য প্রতিশ্রুতি, এটা boilerplate কোড হ্রাস
imGs

155

একটি কাঠামোগত সাম্য a == bঅনুবাদ করা হয়

a?.equals(b) ?: (b === null)

অতএব তুলনা করার সময় null, কাঠামোগত a == nullসাম্যতাকে একটি রেফারেন্সিয়াল সমতাতে অনুবাদ করা হয় a === null

ডক্স অনুসারে , আপনার কোডটি অপ্টিমাইজ করার কোনও অর্থ নেই, সুতরাং আপনি ব্যবহার করতে পারেন a == nullএবং a != null


নোট করুন যে যদি ভেরিয়েবলটি একটি পরিবর্তনীয় সম্পত্তি হয় তবে আপনি এটিকে ifস্টেটমেন্টের অভ্যন্তরে অ-অ-প্রকারে স্মার্ট কাস্ট করতে পারবেন না (কারণ এটি মানটি অন্য থ্রেডের মাধ্যমে সংশোধিত হতে পারে) এবং এর পরিবর্তে আপনাকে সেফ কল অপারেটরটি ব্যবহার করতে letহবে।

নিরাপদ কল অপারেটর ?.

a?.let {
   // not null do something
   println(it)
   println("not null")
}


আপনি এটি এলভিস অপারেটরের সাথে একত্রে ব্যবহার করতে পারেন।

এলভিস অপারেটর ?: (আমি অনুমান করছি কারণ জিজ্ঞাসাবাদের চিহ্নটি এলভিসের চুলের মতো দেখাচ্ছে)

a ?: println("null")

এবং আপনি যদি একটি ব্লক কোড চালাতে চান

a ?: run {
    println("null")
    println("The King has left the building")
}

দুজনের সমন্বয়

a?.let {
   println("not null")
   println("Wop-bop-a-loom-a-boom-bam-boom")
} ?: run {
    println("null")
    println("When things go null, don't go with them")
}

4
আপনি ifনাল চেক ব্যবহার করবেন না কেন ? a?.let{} ?: run{}বিরল ক্ষেত্রে শুধুমাত্র উপযুক্ত, অন্যথায় এটি
মূর্খতা

4
@ ভোটদান আমি nullচেকের জন্য ব্যবহার না করার পরামর্শ দিচ্ছিলাম না , আমি অন্যান্য কার্যকর বিকল্পগুলি তালিকা করছিলাম। যদিও আমি নিশ্চিত না যে runকোনও ধরণের পারফরম্যান্স পেনাল্টি রয়েছে কিনা । আমার উত্তরটি আরও স্পষ্ট করতে আপডেট করব।
বেনিটো বার্তোলি

4
@ ভোদান যদি aএটি varহয় a?.let{} ?: run{}তবে গ্যারান্টিটি ব্যবহার করে letএটি পুরো ক্ষেত্রের জন্য সঠিকভাবে আবদ্ধ হবে । যদি aএটি valহয় তবে কোনও পার্থক্য নেই।
madeinqc

4
@ মেডিইনকিউসি যদি এটি হয় valতবে লেট ব্যবহার করা আলাদা এবং এটি খারাপ। আমি এই নিবন্ধটি এটি ব্যাখ্যা করে খুব ভাল পেয়েছি - কোটলিন: নাল চেক করার জন্য কেবল এলইটি ব্যবহার করবেন না
সুফিয়ান

39

নাল হ্যান্ডলিং এর কোটলিন উপায়

সুরক্ষিত অ্যাক্সেস অপারেশন

val dialog : Dialog? = Dialog()
dialog?.dismiss()  // if the dialog will be null,the dismiss call will be omitted

কাজ করা যাক

user?.let {
  //Work with non-null user
  handleNonNullUser(user)
}

প্রারম্ভিক প্রস্থান

fun handleUser(user : User?) {
  user ?: return //exit the function if user is null
  //Now the compiler knows user is non-null
}

অপরিবর্তনীয় ছায়া

var user : User? = null

fun handleUser() {
  val user = user ?: return //Return if null, otherwise create immutable shadow
  //Work with a local, non-null variable named user
}

ডিফল্ট মান

fun getUserName(): String {
 //If our nullable reference is not null, use it, otherwise use non-null value 
 return userName ?: "Anonymous"
}

ভের পরিবর্তে ভাল ব্যবহার করুন

valকেবল পঠনযোগ্য, varপরিবর্তনযোগ্য। এটি যতটা পঠনযোগ্য কেবল ততটুকু বৈশিষ্ট্য ব্যবহার করার পরামর্শ দেওয়া হয়েছে, সেগুলি থ্রেড-নিরাপদ।

ল্যাটিনাইট ব্যবহার করুন

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

private lateinit var mAdapter: RecyclerAdapter<Transaction>

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   mAdapter = RecyclerAdapter(R.layout.item_transaction)
}

fun updateTransactions() {
   mAdapter.notifyDataSetChanged()
}

এর মধ্যে 3/4 জন এলভিস ব্যবহার করছে বলে আমি সর্বশেষটিকে "ডিফল্ট মান" (এলভিস নয়) বলি।
অজাহানচর্লস

@ অজাহানচর্লেস বোঝায়))
লেভন

4
এটি আবর্জনা, আধুনিক যে কোনও ভাষা এর চেয়ে বিকল্পগুলির সাথে আরও ভাল ডিল করতে পারে। এটি প্রোগ্রামারদের জন্য সুবিধার চেয়ে আরও কাজ
জেবারোস 35

10

@ বেনিটো বার্তোলিতে যোগ করা,

সংমিশ্রণটি আসলে-অন্যরকম নয়

"test" ?. let {
    println ( "1. it=$it" )
} ?: let {
    println ( "2. it is null!" )
}

ফলাফল হলো:

1. it=test

কিন্তু যদি:

"test" ?. let {
    println ( "1. it=$it" )
    null // finally returns null
} ?: let {
    println ( "2. it is null!" )
}

ফলাফল হলো:

1. it=test
2. it is null!

এছাড়াও, যদি প্রথমে এলভিস ব্যবহার করে:

null ?: let {
    println ( "1. it is null!" )
} ?. let {
    println ( "2. it=$it" )
}

ফলাফল হলো:

1. it is null!
2. it=kotlin.Unit

5

দরকারী পদ্ধতিগুলি পরীক্ষা করে দেখুন, এটি কার্যকর হতে পারে:

/**
 * Performs [R] when [T] is not null. Block [R] will have context of [T]
 */
inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
    return input?.let(callback)
}

/**
 * Checking if [T] is not `null` and if its function completes or satisfies to some condition.
 */
inline fun <T: Any> T?.isNotNullAndSatisfies(check: T.() -> Boolean?): Boolean{
    return ifNotNull(this) { it.run(check) } ?: false
}

নিম্নলিখিত ফাংশনগুলি কীভাবে ব্যবহার করবেন তা নীচে সম্ভাব্য উদাহরণ:

var s: String? = null

// ...

if (s.isNotNullAndSatisfies{ isEmpty() }{
   // do something
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.