■ Kotlin #17:null許容型

Kotlinのクラス
前回記事:Kotlin #16:データクラス


null許容型

Kotlinでは基本的に変数などにnullを設定できない。
明示的にnullを許容する指定が必要 = null許容型

型の後ろに ? を付けるとnull許容型となる。

null許容型はNullPointerExceptionを防ぐためにプロパティに対して実行できる操作は制限される。
例えば以下の操作(length)はコンパイルエラーとなる。
val nullable: String? = "null"
nullable.length
  
エラーを防ぐにはnullチェックを行う。
val nullable: String? = "null"
if (nullable != null) {
  nullable.length
}
  
一度nullチェックを行えば、同じスコープ内ではnull非許容型として扱われる。
= スマートキャスト

安全呼び出し演算子

安全呼び出し演算子:nullチェックとメソッド呼び出しを同時に行う演算子。
演算子は "?."
val text: String? = null
val count = text?.length
  
上記の場合 count は null となる。

エルビス演算子

エルビス演算子:値がnullだった場合にデフォルトの値を返す。
演算子は "?:"
"a ?: b" とすると、aがnullであればbを、そうでなければaを返す。
val text: String? = null
val count = text?.length ?: -1
  
上記の場合 count は -1 となる。

遅延初期化

コンストラクタで値が設定できない場合、その変数をnull許容型のミュータブル変数として宣言しても良いが、
これではプロパティ参照ごとにnullチェックが必要となる。

遅延初期化でこれを解決する方法。
lateinit修飾子を付けることで初期化するタイミングを遅らせる。
class Foo {
  lateinit var bar: String?
  fun onCallback(text: String) {
    bar = text
  }
}
  
ミュータブルでプリミティブ型以外にのみ使用できる。
値設定前にプロパティにアクセスすると例外となる。

!!演算子

!!演算子:null許容型を非許容型へ変換する。
nullを変換しようとすると例外が発生する。
基本的に使うべきでない。
func countText(text: String?) = text!!.length
  

プラットフォーム型

Javaのメソッド呼び出し等で使用。
Javaではnull許容型が無いので、@Nullable、@NonNullアノテーションで明示していればkotlinではnull許容型・非許容型に自動変換される。

アノテーションが無い場合はプラットフォーム型に変換される。
プラットフォーム型はnull許容性の情報も持たない型であり、null許容型・非許容型どちらとしても扱える。
安全性は自分で調べる必要がある。

安全キャスト

安全キャスト:nullチェックと型変換を同時に行う。
演算子は "as?"
キャストできない場合はnullを返す。
fun printText(tet: CharSequence) {
  val s : String = text as? String ?: return
  print(s)
}
  

ちなみに、
・通常のキャストは as演算子
・型チェックは is演算子
を使う。





次回記事:Kotlin #18:スコープ関数


Android Studio, Kotlin学習

0 件のコメント:

その他の記事