【Null安全】スマートキャスト、エルビス演算子、安全呼び出し【Android・Kotlin】

Kotlinの基礎を学んだので、今回はNull安全についてまとめてみた。Javaでは、ぬるぽ (NullPointerException) が許されているが、Kotlinはぬるぽにならないような仕組みでできている。オブジェクトが、nullであり得るか否かを明確に区別する。

スマートキャスト

Nullableな変数を自動的にNotNullへキャストしてくれる。

val x:Int? = "3".toInt()
val y:Int? = "2".toInt()

if (x == null || y == null) {
	return
}

println(x * y) // ここではx、yはNotNullとなっている

なんと、型に対してもスマートキャストは働く。

下のコードの if (obj !is String) return null に注目。

引数objはAny型で渡されたが、いつの間にかobj.lengthのようにStringクラスのメソッドが使える用になっている。これは if (obj !is String) return nullでのチェック以降は、自動的にStringクラスにキャストされたのだ。

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null // `!is` は `is`の否定形
    return obj.length
}

もちろん、if文だけでなくwhen文でも使える。xの型によって処理を分けられるのだ。

when (x) {
    is Int -> // xはInt型にキャストされている
    is String -> // xはString型にキャストされている
    is Hoge -> // xはHoge型にキャストされている
    is Fuga -> // xはFuga型にキャストされている
    else -> // xはその他の型にキャストされている
}

エルビス演算子

エルビス演算子 ?: を使えば、nullであった場合のデフォルト値を渡すことができる。

次のように使えるだろう。

val files = File("Hoge").listFiles()
println(files?.size ?: "ファイルが空です")

firstOrNull()は文字列の頭文字を返すメソッドだ。nullだったらエルビス演算子以降の空文字を返すことになる。

val email = "hoge@fuga.xxxxx"
println(email.firstOrNull() ?: "")

?: throw IllegalStateException("Email is missing!")のように、例外を投げて強制終了させることだってできる。

val values = mapOf<String, String?>("email" to null)
val email:String? = values["email"] ?: throw IllegalStateException("Email is missing!")

if (email != null) {
	println(email)
}

上記の例外をスローさせたい場合に、エルビス演算子ではなく requireNotNull を使っても良い。

var fuga:String? = null
var hoge: String = requireNotNull(fuga, {
    fuga = "fuga"
    "${fuga} は nullなわけがない"
})

ここでは第二引数にラムダ式で、例外時のメッセージを渡すようになっている。

安全呼び出し

オブジェクトがnullでなかったら、メソッドを実行したい場合はあるだろう。たとえばデリゲートパターンだ。Swiftでは良くやるが、Kotlinでも同じように書くことができる。

public var delegate:Hoge? = null

...

delegate?.someMethod() // delegateがnull出ない場合のみ実行される。

関数letと組み合わせると、次の表現も可能だ。オブジェクトがnullでない場合、letに処理を任せる といったイメージだ。

val value = null
value?.let {
	println("valueがnullでなければここが実行される")
}

let内のラムダ式では、itが使える。エルビス演算子と組み合わせれば、次のように簡潔な表現ができる。

val hoge:String? = "ほげほげ"
val fuga = hoge?.let { it + " ふがふが" } ?: ""
println(fuga) //=> ほげほげ ふがふが

Booleanだってnullableになりたい!

SwiftだとBoolはオプショナル型(nil)にはなれなかったはず。

Kotlinなら次のように、Boolean値がオプショナル型になることができる。

val b: Boolean? = true
if (b == true) {
	println("b は true")
} else {
	println("b は false か null である")
}

デスクワークの負担を減らすアイテム

作業効率をアップさせるには姿勢が大事です!実際に使ってみてどれもオススメなのでよかったら参考に!

Bestandノートパソコンスタンド 11 '' -16 '' Macbook Air Pro/富士通と互換性のある放熱性に優れたアルミニウム合金PCスタンド-シルバー
Bestandノートパソコンスタンド 11 '' -16 '' Macbook Air Pro/富士通と互換性のある放熱性に優れたアルミニウム合金PCスタンド-シルバー

ノートパソコンの高さをあげると、長時間のデスクワークでも作業者の負担を軽減する事が可能です。 アルミニウム製品、純正品、高品質、高級感があ ります。 対応機種:MacBook、MacBook Air、MacBook Pro、富士通と対応11"-16"ノートパソコン スタンド.

Amazon
AKRacing ゲーミングチェア Pro-X V2 GREY
AKRacing ゲーミングチェア Pro-X V2 GREY

AKRacingハイエンドゲーミングチェア。大きめの座面でゆったりとした座り心地。張地を経年劣化に強い高耐久仕様のPUレザーに変更したアップグレードモデル 寸法:背もたれ幅55cm/奥行55cm/高さ95cm、座面下高さ:32~39cm、座面厚さ:13cm、重量:25kg

Amazon
Kensington ExpertMouse ワイヤレストラックボール K72359JP
Kensington ExpertMouse ワイヤレストラックボール K72359JP

接続方式/Bluetooth、2.4GHz USB付属品/レシーバー、パームレスト、日本語取扱説明書 サイズ(本体):W130×D157×H65mm 対応OS:2.4GHzUSB:Windows10/8.1/8/7、MacOS10.8以降/Bluetooth4.0LE:Windows10/8.1、MacOS10.8以降

AmazonRakuten

Anrdoidアプリ開発にオススメの書籍

こちらの本は、図や絵が多くてわかりやすく、Androidアプリ開発初心者でも理解しやすい内容。基本的なことはしっかりおさえられるので、この手の本は一冊読んでおくと良と思う。

基本からしっかり身につくAndroidアプリ開発入門
基本からしっかり身につくAndroidアプリ開発入門

圧倒的な多数のユーザーが使っているヤフーのアプリ。その制作の最前線にいる黒帯エンジニアが、ユーザーが使いやすいアプリの大切な基本をしっかりと解説します。

KindleAmazonRakuten

Kotlinの実践的な使い方が学べる内容の本で、プログラミング技術をもっと磨きたい人向け。センスの良いプログラミングがたくさん紹介されていて、個人的には「目からうろこ」の連続だった本。

Kotlinプログラミング
Kotlinプログラミング

Kotlinは、Javaとの相互運用を可能にし、Android OSでGoogleがフルサポートする静的型プログラミング言語です。この言語は、Javaだけでは十全ではない(Javaだけでは実装に手間がかかりすぎる)、軽量かつ豊かな表現形式や、他言語ではすでに実装されている最新の機能を盛り込んでいます。

KindleAmazonRakuten

参考

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/