LoginSignup
3
2

More than 5 years have passed since last update.

Android開発、JavaのOptionalと奮闘する24時間

Posted at

JavaのOptionalと向き合って

今回はAndroid開発で重要なOptionalについて学習しましたのでアウトプットしてみます。
SwiftでiOS開発する時にはもはやOptional抜きでの開発は考えられないぐらい
Optionalという概念はモバイル開発でよく使われています。

iOSでいうことの

Optional.swift
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ファイルの変更が必要とのことでした。

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.java

       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を取り出すと言った感じです。

一般的な書き方としては

Unwrap.java
        // orElse
        String hoge = optString.orElse("デフォルト値");
        Integer foo = optInt.orElse(100);

と言った感じでStringIntegerに直します。

他には

Present.java
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のOptionalのモナド的な使い方

Java 8 "Optional" ~ これからのnullとの付き合い方 ~

[Java8] Optionalで脱Exception!

この辺りのページを参考にすればよりOptionalの必要性を理解することができます。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2