JavaのOptionalと向き合って
今回はAndroid開発で重要なOptionalについて学習しましたのでアウトプットしてみます。
SwiftでiOS開発する時にはもはやOptional抜きでの開発は考えられないぐらい
Optionalという概念はモバイル開発でよく使われています。
iOSでいうことの
let string1: String? = nil
let string2: String = "Hello Swift"
たったこれだけの違いですが、SwiftではOptinalを使うコストというのは非常に最小限で表現できました。
当然Objective-CもOptionalの概念が後から導入されました。
そのため、さもやJavaも簡単に書けるだろうとタカを括っていたら
これを使うのがなかなか難しかった印象があります。
Optionalを使うための準備
JavaにもOptionalを使えることが分かって、
さあ使おうと思ったらいきなりコンパイルエラーが起こりました。
どうやら、AndroidStudioではデフォルトで付いているのではなく、
APIレベルというものがあるらしいです。
API Levelが24以上の時しか使えないそうなので、build.gradleファイルの変更が必要とのことでした。
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.sanpuru.sampleapp"
minSdkVersion 24 // <- ここを24以上に変更する
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
こうしないとOptionalが使えないとのこと。
もちろん、このファイルを変更したらSyncします。
これでやっと使えるようになります。
JavaでOptionalを宣言してみよう
さあ、ここからやっとJavaでOptionalが使えるようになりました。
宣言の仕方は下記の通ります。
StringとIntegerを宣言します。
Optional<String> optString = Optional.of("string");
Optional<Integer> optInt = Optional.of(1);
このように宣言します。
固定値が入っていますが、実際の現場ではこのような使われかたはせず
大体はAPI通信を行なった後に帰ってくるJSONのオブジェクトのキー値を差し込む感じになります。
これでJSONのvalueがnull
であってもアプリが落ちることがなくなりました。
Optionalの変数を実際に使うにはどうすれば良いか
上記ではstringではなく、Optional.of("string")の値が入っています。
これをprintしてもstringにはなりません(多分)。
Optionalはそのままでは使われることはなく、普通はunwrapします。
イメージとしてはOptionalというラップに包まれているstringや1を取り出すと言った感じです。
一般的な書き方としては
// orElse
String hoge = optString.orElse("デフォルト値");
Integer foo = optInt.orElse(100);
と言った感じでString
やInteger
に直します。
他には
if (optString.isPresent()) { // 値の存在をチェックするメソッド
// 値を取得するgetメソッドは、値が存在していない場合実行時例外を投げてアプリが落ちる
String string = optString.get();
System.out.println(string);
}
という使い方がありますが、上記のgetメソッドは値が存在しない場合は
(例えば、Optional.of("")という感じの場合)
実行時エラーを吐いてしまってアプリが落ちてしまいます。
なので、.orElse(デフォルトの値)
と言ったような書き方になるんじゃないでしょうか。
Optionalの使い方をマスターした後に学習しやすい概念
僕の場合はOptionalを理解した後はJava8 Streamが使えるようになるんじゃないかなと思います。
iOSでいうことのRxSwiftと同じような書き方になってきますね。
その後にJavaを書くようになってからラムダ式だとか、メソッド参照の意味とかを理解できるようになりました。
この辺を理解できるようになったらあなたも立派なJavaエンジニアになれると思いますよ。
参考ページ
Java 8 "Optional" ~ これからのnullとの付き合い方 ~
この辺りのページを参考にすればよりOptionalの必要性を理解することができます。