実は私は、普段の開発作業ではEmacsで作業していることが多く、IDEをあまり使うことがありません。
でもIDEってすごくいいですよね。もちろん作業効率とか生産性みたいな言葉で言うところの良さもあるのですが、時々そういう言葉を超えた良さみたいなものを感じることがあります。12月の街中を歩きながら、そんな良さって一体なんだろうと考えていたら、あ、そうか、
「励まし」
なのかなって、ふと思いました。
このクラスのメソッドなんだっけ、あの何とかっていう、、みたいに思っているとさりげなく教えてくれたり、変なtypoすると、そこまちがってますよみたいに教えてくれるのって、要は励ましなんです。
IDE欲しいって気持ちは、生産性あげたいみたいな簡単な思いじゃなくて、心が励まされたがってるんだっていうことの表れなんだと思うんです。
さて、最近IDEの一つであるAndroid Studioですごく励まされる機能と出会ったので、ご紹介します。
Android Studioは最近バージョンが3系にアップデートされましたが、その時注目の機能としてKotlinの正式対応が入りました。
これまでもKotlinでの開発は可能でしたが、Android Studio 3.0になって、プロジェクト作成時にKotlinを利用する設定にすれば、特別な手順を使わずに対応ができるようになりました。
とはいえKotlin対応するとしても、Android関連の書籍は大体Javaで書いてありますし、ネットの情報も今時点ではやっぱりJavaの方が多いです。そんな中やっていけるのかと心配な開発者のためにAndroid StudioにはJava からKotlinの変換機能がついています。
特にいいと思うのはファイルごとの一括置換だけでなく、コード片をコピペするとKotlinに変換してくれることです。これのおかげでJavaのサンプルコードがあれば、すぐにKotlinのコードに取り入れることができます。
すごく励まされますね。
実際にどのくらい自然に変換されるか、元になったJavaのコードと、Android Studioで変換したKotlinのコードを比べてみてみましょう。
まず普通の変数の宣言と初期化です。
// Java
int a = 123;
final int b = 567;
// Kotlin
var a = 123
val b = 567
Kotlinは型推論ができるので、変数がvar, valだけで宣言されています。
また、元がfinalになっている時はvalにしてくれます。
初期化が伴わない変数宣言の場合は、何らかの値が代入されるように変換されます。
// Java
int i;
String s;
// Kotlin
var i: Int = 0
var s: String? = null
この場合上のStringのケースなどは、Nullableになります。これについて一旦nullで初期化したくない場合は、以下のように修正すればNon-nullで宣言することもできます。
lateinit var s: String
次はクラスの変換です。
// Java
public class PublicClass {
private String a = "abc";
}
private class PrivateClass {
private String a = "abc";
}
class MyClass{
private String a = "abc";
}
// Kotlin
class PublicClass {
private val a = "abc"
}
private class PrivateClass {
private val a = "abc"
}
internal class MyClass {
private val a = "abc"
}
JavaでpublicのものはKotlinでもpublic(修飾子なし)になり、privateもprivateになります。
Javaで修飾子なし(同一パッケージ内で参照可)については、Kotlinではinternal(同一モジュール内で参照可)になります。これについては微妙に意味が異なるので、意図通りか確認した方がいいかもしれません。
コンストラクタを一つ持っているクラスを変換したところです。
// Java
class MyUser {
private String name;
private int age;
public MyUser(String name, int age) {
this.name = name;
this.age = age;
}
}
// Kotlin
internal class MyUser(private val name: String, private val age: Int)
Kotlinではプライマリコンストラクタのヘッダで宣言でき、そのままプロパティとして引数を受け取れます。このため、変換されるときに、簡単な内容に変換してもらえます。
少し長いですが、Androidでイベントリスナーの作成のため、インターフェースを実装した匿名クラスを変数に代入しているところです。
// Java
private final TextureView.SurfaceTextureListener mSurfaceTextureListener
= new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
openCamera(width, height);
}
(中略)
@Override
public void onSurfaceTextureUpdated(SurfaceTexture texture) {
}
};
// Kotlin
private val mSurfaceTextureListener = object : TextureView.SurfaceTextureListener {
override fun onSurfaceTextureAvailable(texture: SurfaceTexture, width: Int, height: Int) {
openCamera(width, height)
}
(中略)
override fun onSurfaceTextureUpdated(texture: SurfaceTexture) {
}
それぞれの言語でやや実装方法が異なる内容なのですが、
Javaの場合
Kotlinの場合
問題なく変換してくれました。
いかがだったでしょうか。実際に開発作業でも使ってみて、Javaのサンプルコードを元にしてKotlinのアプリを作るといったことは十分に行えるレベルでした。Kotlinぽい書き方にする工程は自分でやっていくしかありませんが、Kotlinの資料が少ないから、とりあえずJavaにしようという妥協はしなくても、このようにAndroid Studioが励ましてくれるので大丈夫です。
皆さんもIDEに励まされながら、楽しくて安心なクリスマスを過ごされてはいかがでしょうか。