新しいJavaの書き方
Android Studio 3.0では、Kotlinのサポートだけでなく、本来の開発言語であるJavaの対象バージョンも増えています。今まではJava 6と7のみの対応でしたが、Android Studio 3.0からJava 8がサポートされました。Java言語そのものもJava 8で大きな機能追加が行われ、新しい書き方が可能となっています。それが正式サポートされたということは、Android Studio 3.0からその書き方が可能ということになります。次はそれを見ていきましょう。
プロジェクトをJava 8対応に設定
作成したプロジェクトでJava 8のコードを記述するには、プロジェクトに対してその設定を行う必要があります。作成したプロジェクトの[File]メニューから[Project Structure...]を選択してください。表示されたProject Structure画面の左のカテゴリ選択欄から[app]を選択してください。図3の画面が表示されるので、[Source Compatibility]と[Target Compatibility]のドロップダウンリストから1.8を選択してください(※注1)。
![図3 Project Structure設定画面でJava 8に設定](http://cz-cdn.shoeisha.jp/static/images/article/10554/10554_003_s.png)
※注1:Javaのバージョン番号は1.0、1.1、1.2と0.1刻みがメジャーアップデートとなっています。1.4までは、この番号を使っていました。1.5からは製品バージョンが与えられるようになり、1.5がJava5.0、1.6からはJava 6、Java 7、Java 8といった名称になっています。
ラムダ式を使うと無名クラスが不要となる
Java 8での大きな変化はラムダ式の導入です。特に、関数型インターフェースと組み合わせた記述方法はAndroidアプリ開発での恩恵が大きいです。関数型インターフェースは、メソッドがひとつしか記述されていないインターフェースのことです。Android SDKではリスナインターフェースとして用意されているもののうち、かなりの数が関数型インターフェースです。
具体例を見てみましょう。
例えば、リストビューにOnItemClickListenerを設定する場合、これまでは無名クラスを使う際はリスト2のように記述していました(lvCocktailはListViewです)。
lvCocktail.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { クリック時の処理 } });
AdapterView.OnItemClickListenerは、onItemClick()メソッド1個のみが定義された典型的な関数型インターフェースです。この場合、ラムダ式を導入すればリスト3の記述が可能です。
lvCocktail.setOnItemClickListener((adapterView, view, position, id) -> { クリック時の処理 });
非常にすっきりした書き方です。
なお、Android Studio 3.0では関数型インターフェースの無名クラスを記述すると、図4の通りラムダ式への書き換えを提案してくれます。
![図4 ラムダ式への書き換えを提案してくれる](http://cz-cdn.shoeisha.jp/static/images/article/10554/10554_004_s.png)
左側の電球をクリックするとメニューが表示されます。[Replace with lambda]を選択すると、リスト3への書き換えを自動で行ってくれます。
![図5 ラムダ式への書き換えを自動で行ってくれる](http://cz-cdn.shoeisha.jp/static/images/article/10554/10554_005_s.png)
try-with-resourcesの記述でfinallyが不要となる
Javaの例外処理には、リソースの自動解放を行ってくれるtry-with-resourcesと呼ばれる記述方法があります。これはJava 7で導入された記述方法ですが、こちらもAndroid Studio 3.0で使えるようになりました。
こちらも、具体例を見てみましょう。
例えば、Android端末内のSQLiteを利用する場合、SQLiteOpenHelperを継承したヘルパークラスを作成し、そのヘルパークラスからSQLiteDatabaseオブジェクトを取得する必要があります。このSQLiteDatabaseオブジェクトは通常finallyで確実に解放する必要がありました。したがってリスト4のようなソースコードになっていました。
DatabaseHelper helper = new DatabaseHelper(MainActivity.this); SQLiteDatabase db = helper.getWritableDatabase(); try { DB処理 } catch(Exception ex) { 例外処理 } finally { db.close(); }
これが、リスト5の通りtry-with-resourcesで記述できるようになります。
DatabaseHelper helper = new DatabaseHelper(MainActivity.this); try(SQLiteDatabase db = helper.getWritableDatabase()) { DB処理 } catch(Exception ex) { 例外処理 }
findViewByIdのキャストが不要となる
Androidアプリ開発中で多用するコードとしてfindViewById()があります。これは画面部品を取得するコードです。例えば、IDがlvCocktailのListViewを取得するにはリスト6のコードを記述していました。
ListView lvCocktail = (ListView) findViewById(R.id.lvCocktail);
今までは、このfindViewById()を使う際はリスト6のように必ずキャストが必要でした。これが、Android Studio 3.0からは不要となります。実際、リスト6のコードを記述すると、Android Studioは図6の通りキャスト部分をグレーアウトさせ、不要であると提案してくれます。
![図6 キャストが不要であると提案](http://cz-cdn.shoeisha.jp/static/images/article/10554/10554_006.png)
今後はリスト7の記述が可能となります。
ListView lvCocktail = findViewById(R.id.lvCocktail);