خانه » Kotlin » اندروید با kotlin قسمت پنجم– Nullability

اندروید با kotlin قسمت پنجم– Nullability

در قسمت قبلی آموزش : اندروید با kotlin قسمت چهارم – Kotlin Syntax (متغیرها Variables)  با متغیر ها در کاتلین آشنا شدیم

در این پست در مورد Nullability صحبت می کنیم.

 

یکی از مزایایی که باعث میشه شما و دیگر برنامه نویسان از Java به سمت Kotlin مهاجرت کنن همین null safe بودن هست، یعنی دیگه با Null pointer exception سر و کله نمی زنید، البته نه به طور ۱۰۰% ، هنوز هم ممکنه که شما با این موارد برخورد کنید اما تا حد زیادی از این خطا جلوگیری میشه و اکثر مواردی که امکان ایجاد null pointer را ممکن می کنند در زمان کامپایل مشخص می شوند.

 

حالا به مثلا دقت کنید:

در پست قبلی تعریف متغیری رو مثال زدیم :

var x: Int? = null
val y: Int = 5
val z = 5

در این مثال ها، فقط x میتونه null باشه، y و z اگر مقدار null بگیرند در زمان کامپایل خطا می دهند و اگر از intellij idea و یا android studio زمان کد زدن استفاده کنید، زمان نوشتن کد خطا میده و اجازه مقدار دهی null به یک متغیر غیر nullable نمیده، همونطور که حتما تا الان فهمیدید متغیری nullable هست که بعد نوشتن نوعش از علامت سوال استفاده شده باشد “؟” در مثال بالا x از نوع Int? هست و مقدار null گرفته، y از نوع Int هست و علامت سوال نداره و نمیتونه null بگیره حتما باید مقدار غیر null بگیره و همینطور z

خب این کجا به درد میخوره ؟!  زمان استفاده !!!

 

یعنی مثلا فرض کنید قصد داریم مقدار x و y رو باهم جمع کنیم و در یک متغیر که nullable نیست بریزیم مثلا

var a:Int 
a=x+y

در این جا اتفاقی که می افته اینه که کنار x خطا نشون داده میشه، و گفته میشه که نمیتونید یک متغیر nullable رو با یک غیر null جمع کنید، حالا کاری که میتونید بکنید اینه که یا قبل این خط null نبودن x رو چک کرده باشید و یا همینجا بهش بگید که در صورت null بودن x چه مقداری براش بزاره، مثلا مقدار ۰ که در این صورت باید به این شکل نوشته بشه

a = x?:0 + y

همینطور که می بینید از ?: استفاده شده که در واقع به این معنی هست که اگر نال بود پس این مقدار رو برگردون که اینجا مقدار ۰ هست.

 

حالا به مثال دیگه ای توجه کنید:

var nullString: String? = "some string"
var length :Int
var lengthOrNull :Int?

nullString.length // compilation error
nullString?.length // no error, if it's null this line will ignore on runtime
length = nullString?.length //compilation error
lengthOrNull = nullString?.length //nothing wrong

در اینجا زمانی که قصد صدا زدن متد length را داشته باشیم چون nullString مقدارش میتونه null باشه، خط nullString.length در زمان کامپایل خطا میده و میگه نمیتونی متدی از متغیر nullable صدا بزنی، اما در مثال خط بعدی nullString?.length علامت سوال در واقع کار if not null رو می کنه و میگه اگر که null نبود، length رو صدا بزن و اگر null بود صدا نزن (در اینجا چون خروجی مورد نظر نیست مشکلی پیش نمیاد اما در خط بعدی ، وقتی از این عبارت استفاده می کنیم، در صورتی که null باشد مقدار برگشتی null می شود، راه حل استفاده اینه که یا مقدار متغیر مورد نظر هم nullable باشه ، مثل مثال آخر و یا اینکه به اون با “؟:” مقداری بدیم در صورت null بودن

length = nullString?.length?:0

که در این مثال اگر null باشه مقدار۰ و در غیر این صورت مقدار length برگردونده میشه.

 

!!

زمانی پیش میاد که ما قطعا میدونیم که متغیر ما که از نوع nullable هست null نمیشه، و قصد داریم که از خطای کامپایل جلوگیری کنیم و به کاتلین بگیم که عواقبش رو می پذیریم در این صورت از عبارت “!!” استفاده می کنیم

باید خیلی مراقب باشید چونکه در این صورت امکان داره خطای null pointer رخ بده (این یکی از اون مواردی هست که گفتم ۱۰۰% هم از این خطا جلوگیری نمیشه، چون در مواقعی هست که خودمون ریسک می کنیم و از !! استفاده می کنیم)

خوب چرا ؟!

به چند دلیل ممکنه از این استفاده کنیم یکی اینکه ممکنه ما از کلاس های java استفاده کنیم که در این صورت ممکنه response اون کلاس nullable باشه و ما قصد استفاده از اون رو داشته باشیم و یا در مواقعی که از متغیر های تغییر پذیر var استفاده می کنیم حتی بعد از چک کردن null بودن کاماپلر نمیتونه smart cast بکنه و اینجا هم نیازه که از !! استفاده کنیم :

var someString :String? = null
...
val length = 
if(someString!=null)
 someString!!.length
else 
 ۰

در مثال بالا با اینکه مقدار null بودن someString چک شده اما چون نوعش var هست لازمه که باز هم از !! استفاده کنیم.

در این مثال همچنین از قابلیت return کردن if استفاده شده که در قسمت های بعدی آموزش در مورد این هم صحبت میکنم.

 

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا