【完走賞】MxShun ひとりマラソン 🏃 Advent Calendar 2022 毎週金曜日は Kotlin の記事を書こう!2記事目です。
1年あまりサーバサイド Kotlin を書いていましたが、この度の転職で Java8 時代のシステム保守も行うようになりました。
Kotlin エンジニアのバックグラウンドを持つ私が、改めて Java を書き始めて感じたことをまとめます。
1. 基本ミュータブルで怖い + 都度 final
を付けるの面倒
Kotlin のクラス・関数・変数はデフォルトで final
、つまり不変で継承不可です。スコープは最小限でイミュータブルに保つという思想から来ているのでしょうか。コードの見通しのたてやすさから私もこの思想を好みます。
他方、Java は気にしないとミュータブルで継承可能です。都度 final
を付ける必要があるので書くのも面倒ですし、かなり冗長です。
って言うか、型宣言や末尾の ;
がないのも改めて素敵ですね。
// in Kotlin
companion object {
private val USER_ID = 1
private val USER_NAME = "MxShun"
}
// in Java
private static final Integer USER_ID = 1;
private static final String USER_NAME = "MxShun";
2. 名前付き引数 使いたい
Kotlin は他のモダン言語と同様に名前付き引数を利用することができます。特に引数が多い関数では、処理のどのインプットにどの値を使うのかが分かりやすくなるので私は好きです。プロダクトコード全体で名前付き引数を使うルールとしたほどです。
Java では名前付き引数が使えません。なので、同じようなことを実現しようとすると説明変数に値を入れるなどちょっとばかし工夫が必要な気がします。
// in Kotlin
val id = assignIdFromBio(
name = "MxShun",
birthDate = LocalDate.of(1997, 11, 23)
)
// in Java
final String id = assignIdFromBio(
"MxShun",
LocalDate.of(1997, 11, 23)
);
3. Kotlin.Collection
使いたい
Kotlin は Collection 関数が豊富です。さながら、Kotlin の中核機能と言っても遜色はないと思っています。
Java では SE8 での stream 関数の追加で幾分ましになっていますが、それでもメソッドチェーンや .stream()
と toList()
を開始・終端処理として挟むのは冗長です。
// in Kotlin
val ids = users.map {
it.id
}
// in Java
List<String> ids = users.stream()
.map(user -> user.id)
.toList()
4. スコープ関数 使いたい
これは意見が分かれそうです。Kotlin の表現方法のひとつとしてあって然るべきものだと私は思います。
// in Kotlin
val ftpDto = FtpDto().apply {
setHostName(FTP_HOST_NAME)
setUserName(FTP_ACCOUNT_NAME)
setPassword(FTP_PASSWORD)
setOutputFilePath(FTP_PATH + outputFileName)
setLocalFilePath(localFilePath)
}
ftpService.get(ftpDto)
// in Java
FtpDto ftpDto = new FtpDto();
ftpDto.setHostName(FTP_HOST_NAME);
ftpDto.setUserName(FTP_ACCOUNT_NAME);
ftpDto.setPassword(FTP_PASSWORD);
ftpDto.setOutputFilePath(FTP_PATH + outputFileName);
ftpDto.setLocalFilePath(localFilePath);
ftpService.get(ftpDto);
まとめ
改めて、Kotlin は Java の「ちょっと不便だな」ってところを上手くラップしてくれているのが分かりました。Kotlin の思想を逆に Java が取り込む例も増えていますが、やっぱり Kotlin っていいなってなりました。