JavaからKotlinに変えてみる

## はじめに

🙆‍♂️「どうも運動通信社で働くAndroidエンジニアの明田です！
弊社では2021年11月頃からJavaで書かれたのAndroidプロジェクトをKotlinにゴリゴリ書き換えていっています！
Koltin化一緒に進めたいそこのあなた、この世界をKotlinにする運動にこぞってご参加してください！」

※ Kotlin化に伴い得た知見や感想などを書いている記事になります。是非参考にしてください

## Kotlinとは

2017年のGoogleがKotlinを正式にAndroidの開発言語として発表されました。
KotlinはJVM（Java仮装マシン）をサポートしているため、Javaが動くところではどこでもKotlinが動きます。

さらに、Javaが抱えている課題を解消しているのもKotlin化するメリットになります。
その導入の簡単さと、Javaとの親和性、既存プロジェクトへの導入リスクの低さが多くの企業のAndroid開発に採用されている要因ともなっています。

↓Android以外にサーバーサイドとしてKoltinを導入している企業

https://qiita.com/ptiringo/items/dd734ab8064f94139294

💁‍♂️「Kotlinがアプリとサーバーサイドを支配する日もそう遠くないかもしれないですね笑」

## Kotlinの特性3選！

### 安全性
Kotlinは、システムが堅牢で安全という特徴があります。冒頭でも記載した通りAndroidの公式言語である点も、安全と評価される要因の1つになります。

Kotlinは静的な安全が保証されているため、`NullPointerException`いわゆるヌルポが起きにくく、Javaより事前にクラッシュを防ぐことができ安全に使えるように設計されています。

### 簡潔性
産業利用向け汎用言語として作られてりるため、比較的学習しやすい言語だと言われています。

具体的には、Javaだと7行必要なケースもKotlinでは1行で済む場合もあります。Kotlinの入門サイトも用意されていますので、独学で学習することも可能でしょう。

シンプルさは、他の言語と比べても高く評価されています。


### 共存性
Kotlinが持つ特徴3つ目は、Javaと共存できる点です。KotlinはJVM（Java仮装マシン）上で動作できますので、Javaのライブラリやフレームワークを問題なく使えます。
さらに、Javaで書かれたAndroidアプリにKotlinを適用させることも可能です。Javaは誕生からの歴史が長くノウハウも多いため、KotlinとJavaそれぞれのメリットを上手く活用しましょう。

💁‍♂️「`Java → Kotlin`は何の問題もなく適用できるのですが、`Kotlin → Java`は適用できないことが多いんですよね。解決方法はいくつかあるのですが、大体は@JvmStaticというアノテーションをつけることでKoltinで書いたコードをJavaで使用できるようになります」

## Kotlinのメリット3選！

### シンプル
Kotlinを利用するメリットは、シンプルなコードで利用できる点です。述量が少ないことは、作業時間の短縮にもつながります。
今までJavaを利用してきた人が使用すると、もうKotlinしか使えないと考える場合も多いです。初心者にとっても大きなメリットと言えるでしょう。

💁‍♂️「特にJavaのgetter/setterをKotlinで記述すると本当に楽です。」

**getterとsetter**
```Example.java
public class ClassName {
    private int id = 0;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    // 長い。書くのがめんどくさい。
}
```

```Example.kt
class ClassName {
    var id = 0
    // That's all!!

}
```

🕺「探してたものはこんなシンプルなもんだったんだ♪ / Mr.Children Simple」

### エラーが少ない
Kotlinを利用するメリットは、エラーを減らせるという点です。Kotlinは、Null可型とNull不可型が分かりやすく区別されています。

そのため、Null可型の変数にNull不可型の値を入れられますが、Null不可型の変数にNull可型の値を入れるとコンパイルエラーが発生します。

Javaの場合はエラーでもコンパイル時には気が付かないことが多いため、エラーを格段に減らせるでしょう。

```Example.java
// strはnullなのでヌルポで落ちる。がコンパイルは通ってしまう。
String str = null;
str.contains("hoge"); 
```

```Example.kt
// strはnullが確定しているため、コンパイルが通らない。
var str: String? = null
str.contains("hoge")
```

### 学習コスト
学習コストがかからない点が、Kotlinのメリットです。Kotlinは学習の難易度も比較的低く、独学で学習することも可能です。

初心者でも、学習コストをかけずにマスターすることが可能です。Javaを取得している人は、文法が似ている部分も多いため、JavaエンジニアはKoltin習得がかなりはやいでしょう。

Swiftと概念が似ていることもあるため、Kotlinをマスターしている方はiOSエンジニアに鞍替えも容易なようです。

### デメリット

* 既存プロジェクトのjava -> kotlin変換の手間。
* apkサイズが少し増える。（いくつかのブログで調べたところ、50KB〜800KB増えるとのことだった。）

💁‍♂️「JavaからKotlinに変更することで起きるデメリットはほとんどないと思っていますが、一応あるみたいですね。」

参考記事

https://qiita.com/hs7/items/4a5a7906761b19217370#%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88

## 実際にJavaをKotlin化してみよう

ということなのですが、以下の良記事を参考にしていただければできます。

https://qiita.com/SYABU555/items/25b1e81a2437d6a2559f


Koltinが導入できましたら、エラーなどが発生しますが落ち着いてください。
基本的には軽微なエラーなので簡単に解消できます。

Android StudioのProblemsを見てにエラーを解消してください。

## 業務内でのKotlin化指南書
じゃあ実際業務の中でどんな感じでKotlin化進めていくの？？
弊社はアプリの新規機能開発のリリース毎に数ファイルをKotlin化し、その影響のある箇所をしっかりテストした上でリリースするようにしています。

###### 手順としてはこんな感じ
以下の流れで随時Kotlin化を進めています。

```
① 新規機能課題作成
② Kotlin化するファイルを決める(実装スケジュールに影響が出ないように)
③ 実装　　（Koltin化進めてて、既存のコードに大きな影響がある場合は潔く諦める。）
④ テスト　（影響可能性ある範囲を全部のテスト）
⑤ リリース
```

Kotlin化するにあたり、コードをリファクタリングしたり、コメントを追加したりなど保守性を高めることも気にしながら進めています。
💁‍♂️「例えば、部屋を模様替え時についでに本棚を整理したりするみたいな。スマホ買い替えるときについでにいらないアプリ削除するみたいな。」

## さいごに
運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう！

💁‍♂️「Kotlin化を一緒に進めてくれるエンジニア絶賛募集中です！」

https://sportsbull.jp/about/#recruit