Kotlin入門|初心者が知るべき勉強のポイントとJavaからの移行メリット
ヤフー株式会社でAndroidエンジニアをしている片淵雄介(@Buchi_orz)と申します。フロントエンド、iOS、Androidなど様々なプラットフォームを経験し、現在はYahoo!ニュースのAndroidアプリを担当しています。今回はこれからKotlinを始めようとする読者に、Kotlinの魅力と最初に知っておきべきポイントを解説します。
目次
フロントエンド、iOS、Androidと様々なプラットフォームを経験してKotlinにたどり着く
私はウェブ制作会社でのフロントエンドエンジニアからキャリアをスタートしました。以降、iOS、Androidなど様々なプラットフォームのプロダクトに携わり、2016年にヤフー株式会社にAndroidエンジニアとして参画。2019年よりYahoo!ニュースのAndroidアプリを担当しています。iOSアプリの開発とAndroid開発を比較すると、Android開発は自由度が高いと言えます。そのため、工夫のしがいもあり、そこが楽しさにつながっています。
フロントエンドは2年、iOSは2年、Androidは6年経験しています。言語としてはウェブ制作会社時代からJavaを利用しており、そのKotlin移行を行ってきました。
JavaもKotlinも触ってきてはじめてわかることなのですが、Kotlinはとてもプログラミングしやすいポイントが多く、はじめて触れた時には感動しました。5つに絞ってその魅力をお伝えしようと思います。
JavaからKotlinに移行したときの感動5つのポイント
私がKotlinを始めたのは2016年。最初はテストコードから実験的に導入を始めました。Kotlinは、Javaに比べて必要な記述量が減るので、コードを読むのも楽になりますし、Java からKotlinへのリファクタリング時にはリスト操作なんかも気持ちよく書けます。記述量は減るのですが、自由度は高いので、Android開発の醍醐味として感じている楽しさは減っておらず、むしろKotlinだとさらに工夫のしがいが出てきたと感じています。
また、JavaとKotlinは互換性もあり、導入コストは低く、導入することによるメリットのほうが多いと言えます。そこで感じた5つのポイントを紹介します。
1. データクラスで短く書ける
まず1つ目はデータクラス。
例えば、Javaで書いていたこちらのコード。
public class ToDo {
private final Strnig _mTitle;
private final String _mText;
/**
* コンストラクタ
*/
public ToDo(@NonNull final String aTitle,
@Nullable final String aText) {
_mTitle = aTitle;
_mText = aText;
}
public String getTitle() {
return _mTitle;
}
public String getText() {
return _mText;
}
}
Kotlinで書くと、ここまで短くなります。
// Nullになる可能性がある変数の場合は型の後ろに `?` がつきます (Javaだと@Nullable)
data class ToDo(
val title: String,
val text: String?)
「getter、setterはどこに…」と思われるかもしれませんが、Kotlinのdataクラスを使用した場合、ユーザーが実装する必要はなく自動的に生成してくれます。
2. Null安全でクラッシュを防げる
2つ目にNull安全。
KotlinはNull安全プログラミングとしても知られています。そのため、実行時に意図していない箇所でNullPointerExceptionが発生してアプリがクラッシュするような事態も防げます。
上記のKotlinの例でも「?」マークが2箇所ついていました。この記述により、Null許容型となり、マークをつけなかった場合はNull非許容型となります。
実際にどのように使うのか、コードで見てみましょう。
fun main(args : Array) {
// Null非許容型のToDoを生成
val todo: ToDo = ToDo("title", "text")
// titleプロパティはNull非許容なのでOK
printString(todo.title)
// textプロパティはNull許容のためエラーとなる
printString(todo.text)
// Null許容のパラメータの場合、Kotlinのスコープ関数を使用することで出力することが可能となる
todo.text?.let {
printString(it)
}
// Kotlinのエルビス演算子を使用することによりNullの場合、空文字を出力させることも可能となる
printString(todo.text ?: "")
}
/**
* Null非許容の引数textをLog出力
*/
fun printString(text: String) {
println(text)
}
サンプルではあまり利点が感じられないかもしれませんが、API通信を行う際のレスポンスとして使用するときなどに威力を発揮します。
3. リスト操作を気持ちよく書ける
3つ目にリスト操作。
Kotlin独自のものではないので、真新しさを感じる方は少ないかもしれませんが、Android開発においてJavaで書いていたようなリスト操作をKotlinだと気持ちよく書けます。
例えば、Listに入っている文字列を全て大文字に変換したい場合はこうなります。
// 文字列の配列を作成
val strList: List = listOf("first", "second", "third")
val newStrList: List = strList.map { it.toUpperCase() }
大文字に変換するだけではなく、文字数が5文字のものを抽出したい場合も同様に簡単にできます。
// 文字列の配列を作成
val strList: List = listOf("first", "second", "third")
val newStrList: List = strList.map {
it.toUpperCase()
}.filter {
it.length == 5
}
他にもリスト操作をする上で便利な関数が標準で実装されているので、リスト操作をするのが楽しくなるかもしれません。
4. デフォルト引数と名前付き引数で不具合が起こるのを防ぐ
4つ目にデフォルト引数と名前付き引数。
Javaの場合だと引数の違うメソッドを用意しようとした場合、オーバーロードで実装したり、Builderパターンを使用したりするかもしません。しかし、Kotlinであれば簡単に実装することができます。
引数の順序に関しても、名前付きで呼び出すことが可能なので、意図しない箇所に値を入れてしまうような不具合を抑えることができます。
例として、id、title、text要素を持ったデータクラスNoteをみてみましょう。
// id以外はデフォルト引数を持つ
data class Note(
val id: Int,
val title: String = "",
val text: String = "")
// 全ての引数を指定して生成
val hogeNote = Note(0, "hoge", "fuga")
// text以外を指定して生成
val fugaNote = Note(0, "hoge")
// title以外を指定して生成 (名前付き引数を使用する)
val piyoNote = Note(id = 0, text = "fuga")
// idのみ指定して生成
val fooNote = Note(0)
// idはデフォルト引数を持たないので以下の例はエラーとなる
val barNote = Note()
上記の例だと少し簡単すぎるので、以下のようにRetrofitを使用してAPI通信を行う例をみてみましょう。
// API
class NoteRepositoryImpl {
interface Service {
@GET(ApiUrl.NOTES)
fun getAllNote(
@Query("os") type: String = "android"
): Single<List>
}
fun load(): Single<List> {
val service = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(OkHttpClient.Builder().build())
.build()
.create(Service::class.java)
// 引数を指定していないのでAPI通信時にosの値はandroidとして送られる
return service.getAllNote()
}
}
このような実装をすることにより、必要な場合にはパラメータを指定、不要な場合にはパラメータを指定せずにデフォルトを使用することが可能となります。
デフォルトパラメータが変更になった場合も、呼び出し先のパラメータを変更するだけなので簡単ですね。
5. Kotlin KTXで実装量が減る
最後にKotlin KTX。
Kotlin KTXとは、Kotlinの拡張機能セット (Kotlin extensions) であり、Kotlinをもっと便利に使うことを可能にしてくれるものです。
導入も簡単で、build.gradle (ビルドツール) のdependenciesに使いたいモジュールを記述してSyncするだけで使えるようになります。
Kotlin KTX を使用しなかった場合と、使用した場合の違いをみてみましょう。
/**
* Viewの表示・非表示
* Core KTX
*/
// Kotlin KTXを使用しなかった場合
if (hoge > 0) {
view.visibility = VIEW.VISIBLE
} else {
view.visibility = VIEW.GONE
}
// Kotlin KTXを使用した場合
view.isVisible = hoge > 0
/**
* Bundleを作成
* Core KTX
*/
// Kotlin KTXを使用しなかった場合
val bundle = Bundle()
bundle.putString("hoge", "fuga")
bundle.putBoolean("isHoge", true)
// スコープ関数を使用した場合
val bundle = Bundle().apply {
putString("hoge", "fuga")
putBoolean("isHoge", true)
}
// Kotlin KTXを使用した場合
val bundle = bundleOf(
"hoge" to "fuga",
"isHoge" to true)
/**
* ViewModelを生成
* Fragment KTX
*/
// Kotlin KTXを使用しなかった場合
val viewModel by lazy {
ViewModelProviders.of(this).get(HogeViewModel::class.java)
}
// Kotlin KTXを使用した場合
val viewModel: HogeViewModel by ViewModels()
このように、Kotlin KTXを使うことにより実装しないといけない量が削減できます。
今後も便利な拡張機能が増えていくはずです。そして、Kotlinでは簡単にこのような拡張機能を自分で作ることもできます。Javaだと面倒だった処理もKotlinだと簡単に書けるので、どんどん使っていきましょう。
以上、私がKotlinの開発を始めた際に感動したポイントを5つ紹介しました。
他にも、Javaの場合だとクラス名とファイル名を同じにしなければいけなかったのが、Kotlinだと1つのファイルに複数のクラスを書くことができたり、拡張関数という既存のクラスにユーザーが独自で拡張することができる機能があったりとJavaと比べると便利な機能がいくつも用意されています。
Kotlinの勉強を始める際のポイント
上記の5つのポイントで説明したように、Javaで実装しようと思うと少し面倒だった処理も、Kotlinだと簡単に実装することができます。必然的にコードの記述量も減りし、可読性もよくなります。Android開発では公式言語として採用されており、Kotlinを使わないという手は考えられないでしょう。
しかし、「新しくKotlinを学ぼうとしてもどこから始めたらいいかわからない」という方も少なくないでしょう。そこで、私がKotlinを学ぶにあたって参考にした書籍やWebサイトを紹介します。
Kotlinスタートブック
「Kotlinスタートブック – 新しいAndroidプログラミング」、通称「赤べこ本」。Kotlin第1人者の長澤太郎さんの本です。
Kotlinの文法だけでなく、実際にどのようにKotlinを使えばいいのかがわかりやすく解説されています。これからKotlinを始めてみようという方には一番おすすめできる本です。
Kotlinイン・アクション
「Kotlinイン・アクション」はKotlinを少し触ってみて、「パフォーマンス面などもう少し詳細も知りたい」という方におすすめできる書籍です。
完全に初心者の方には少し難しいかもしれませんが、Kotlinの基礎を学んだ後におすすめできる一冊です。
Kotlin公式サイト
「Kotlin公式サイト」には実際にコードを触りながらKotlinの言語を学ぶことができる 「Playground」が用意されています。
公式サイトで一通りKotlinの言語仕様などを学んだ後に、上記の書籍を読んでみるという使い方も良いでしょう。
最後にーーKotlinの学習コストはそこまで高くない
実際に何らかの開発言語を学んだことのある方であれば、Kotlinの学習コストはそこまで高くないでしょう。完全にプログラミングが初めての方であっても、書籍や公式サイトなど学ぶ環境は整っており、楽しくマスターできます。
実際に業務でKotlinを使用するようになってから、コードの可読性もよくなりアプリのクラッシュも減少したように感じています。
今回は紹介できませんでしたが、Kotlin 1.3からCoroutineがStableとしてリリースされました。今後も魅力的な機能がどんどん追加されていくはす。これを機にKotlinを始めてみてはいかがでしょうか。
最後に私が開発に携わっているYahoo!ニュース アプリもぜひ使ってみてください。何か気になる点があればフィードバック頂けるととても嬉しいです。
■関連記事のご紹介: