null許容型
Kotlinでは基本的に変数などにnullを設定できない。
明示的にnullを許容する指定が必要 = null許容型
型の後ろに ? を付けるとnull許容型となる。
null許容型はNullPointerExceptionを防ぐためにプロパティに対して実行できる操作は制限される。
例えば以下の操作(length)はコンパイルエラーとなる。
= スマートキャスト
明示的に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を返す。
演算子は "?:"
"a ?: b" とすると、aがnullであればbを、そうでなければaを返す。
val text: String? = null val count = text?.length ?: -1上記の場合 count は -1 となる。
遅延初期化
コンストラクタで値が設定できない場合、その変数をnull許容型のミュータブル変数として宣言しても良いが、
これではプロパティ参照ごとにnullチェックが必要となる。
遅延初期化でこれを解決する方法。
lateinit修飾子を付けることで初期化するタイミングを遅らせる。
値設定前にプロパティにアクセスすると例外となる。
これではプロパティ参照ごとにnullチェックが必要となる。
遅延初期化でこれを解決する方法。
lateinit修飾子を付けることで初期化するタイミングを遅らせる。
class Foo { lateinit var bar: String? fun onCallback(text: String) { bar = text } }ミュータブルでプリミティブ型以外にのみ使用できる。
値設定前にプロパティにアクセスすると例外となる。
!!演算子
!!演算子:null許容型を非許容型へ変換する。
nullを変換しようとすると例外が発生する。
基本的に使うべきでない。
nullを変換しようとすると例外が発生する。
基本的に使うべきでない。
func countText(text: String?) = text!!.length
プラットフォーム型
Javaのメソッド呼び出し等で使用。
Javaではnull許容型が無いので、@Nullable、@NonNullアノテーションで明示していればkotlinではnull許容型・非許容型に自動変換される。
アノテーションが無い場合はプラットフォーム型に変換される。
プラットフォーム型はnull許容性の情報も持たない型であり、null許容型・非許容型どちらとしても扱える。
安全性は自分で調べる必要がある。
Javaではnull許容型が無いので、@Nullable、@NonNullアノテーションで明示していればkotlinではnull許容型・非許容型に自動変換される。
アノテーションが無い場合はプラットフォーム型に変換される。
プラットフォーム型はnull許容性の情報も持たない型であり、null許容型・非許容型どちらとしても扱える。
安全性は自分で調べる必要がある。
安全キャスト
安全キャスト:nullチェックと型変換を同時に行う。
演算子は "as?"
キャストできない場合はnullを返す。
ちなみに、
・通常のキャストは as演算子
・型チェックは is演算子
を使う。
演算子は "as?"
キャストできない場合はnullを返す。
fun printText(tet: CharSequence) { val s : String = text as? String ?: return print(s) }
ちなみに、
・通常のキャストは as演算子
・型チェックは is演算子
を使う。
次回記事:Kotlin #18:スコープ関数
Android Studio, Kotlin学習
0 件のコメント:
コメントを投稿