Edited at

【Android】Kotlin導入するためにやったこと(学習編)

More than 1 year has passed since last update.

自プロダクトにKotlin導入するために個人的にやった学習方法の紹介です。(LT用資料も兼ねてます)

【Android】Kotlin導入するためにやったこと(説得編)の続きになります。


はじめに

あくまで個人的にやった内容なので、このやり方が必ずしもベストというわけではないです。



学習の流れ



  1. :movie_camera: I/O '17のKeynoteを見てモチベを高める


  2. :book: Kotlin入門までの助走読本を読む


  3. :book: 公式リファレンスをざっと読む


  4. :pencil: Java to Kotlinを試す


  5. :pencil: Kotlin to Javaを試す


  6. :muscle: Kotlinを書いてみる



:movie_camera: I/O '17のKeynoteを見てモチベを高める

まずはGoogle I/OのKeynoteを見てモチベを高める。



(引用) https://youtu.be/Y2VF8tmLFHw?t=1h27m25s


:pencil: Kotlin入門までの助走読本(PDF) を読む

これを読むだけでKotlinの言語的特徴、Javaとの違い、Kotlin移行時のメリット・デメリットなどが分かるので必読です。

80ページ程度、かつ日本語なのでサクッと読めます。



(引用) https://drive.google.com/file/d/0Bylpznm149-gTGRjOFRkWm9PODg/view の1ページ目


以下、目次引用 & 整形



  • 第 1 章 Kotlin について知る


    • 1.1 Kotlin とは

    • 1.2 Kotlin を使うと何が嬉しいのか

    • 1.3 Kotlin の特徴

    • 1.4 将来の展望

    • 1.5 導入事例



  • 第 2 章 Kotlin を学ぶ


    • 2.1 環境構築から HelloWorld まで

    • 2.2 Kotlin の味見

    • 2.3 Java から Kotlin への移行



  • 第 3 章 次のステップ


    • 3.1 学習方法

    • 3.2 コミュニティ

    • 3.3 次回リリースの予告






公式リファレンス をざっと読む

公式リファレンスを読むことで基本的な文法やイディオムなどが分かります。



https://kotlinlang.org/docs/reference/



:pencil: Java to Kotlinを試す

Javaファイルを開いている状態でメニューのCode > Convert Java File to Kotlin FileからKotlinに変換できます。



テストコードをKotlinに変換してみる

// Java

public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

// Kotlin

class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, (2 + 2))
}
}



ActivityをKotlinに変換してみる

// Java

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

// Kotlin

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}



:pencil: Kotlin to Javaを試す

tools > Kotlin > Show Kotlin Bytecode

Decompileボタン押下



KotlinのdataクラスをJavaに変換してみる

// Kotlin

data class User(var name: String, var age: Int)

// Java

public final class User {
@NotNull
private String name;
private int age;

@NotNull
public final String getName() {
return this.name;
}

public final void setName(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.name = var1;
}

public final int getAge() {
return this.age;
}

public final void setAge(int var1) {
this.age = var1;
}

public User(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}

@NotNull
public final String component1() {
return this.name;
}

public final int component2() {
return this.age;
}

@NotNull
public final User copy(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new User(name, age);
}

// $FF: synthetic method
// $FF: bridge method
@NotNull
public static User copy$default(User var0, String var1, int var2, int var3, Object var4) {
if((var3 & 1) != 0) {
var1 = var0.name;
}

if((var3 & 2) != 0) {
var2 = var0.age;
}

return var0.copy(var1, var2);
}

public String toString() {
return "User(name=" + this.name + ", age=" + this.age + ")";
}

public int hashCode() {
return (this.name != null?this.name.hashCode():0) * 31 + this.age;
}

public boolean equals(Object var1) {
if(this != var1) {
if(var1 instanceof User) {
User var2 = (User)var1;
if(Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
return true;
}
}

return false;
} else {
return true;
}
}
}



:muscle: Kotlinを書いてみる


https://try.kotlinlang.org/ をやってみる

ブラウザでKotlinの文法などを手軽に学べます。



とりあえずJavaっぽく書いてIDEの変換に任せる

まず書いてみると



returnでWarningが出てる :warning:


Option + Enter (Alt + Enter)を押すととIDEが教えてくれるので押してみると


シッュとなる(Kotlinらしくなる)

fun increment(num: Int): Int = num + 1

(再掲)シュッとなる前

fun increment(num: Int): Int {

return num + 1
}

単一の式からなる関数定義はreturnを省略できる


ちなみに戻り値の型が自明なときは型も省略できる

fun increment(num: Int): Int = num + 1

:arrow_down:

fun increment(num: Int) = num + 1


もう一つ例を挙げるとif文もシュッと書ける場合があります。

var max: Int

if (a > b) {
max = a
} else {
max = b
}

:arrow_down: シュッ(ifは式なので代入できる)

var max: Int = if (a > b) {

a
} else {
b
}

:arrow_down: シュッ(三項演算子っぽくも書ける)

var max: Int = if (a > b) a else b



慣れてきたらコーディング規約やベストプラクティスに沿って書く

FRESH!のコーディング規約は可読性を重視した規約になっているのでとても参考になります。

また、Idiomatic Kotlin. Best Practices.というベストプラクティス集もオススメです。



継続的に勉強するために


  • コミュニティに参加する



  • 情報発信する


    • 記事を書いたり発表してみる



  • Podcastを聞く



  • フルKotlinでアプリを作ってみる



まとめ



補足

今回Jvmアノテーションについては言及しませんでしたが、既存のJavaプロダクトに導入していく際はJavaからどう見えるかを意識しつつ書く必要もあります。

Kotlinを学ぶという目的だけであれば、フルKotlinでアプリを作ってみるのが個人的にはオススメです。



参考

Latest Posts – Talking Kotlin

http://talkingkotlin.com/

Reference - Kotlin Programming Language

https://kotlinlang.org/docs/reference/

A multi-language Hello | Try Kotlin

https://try.kotlinlang.org

kotlin-prior-learning-book.pdf - Google Drive

https://drive.google.com/file/d/0Bylpznm149-gTGRjOFRkWm9PODg/view

【Android】Kotlin導入するためにやったこと(説得編) - Qiita

https://qiita.com/rkowase/items/a2f26c64c60d04d51c94

【Android】KotlinからJavaへ変換(デコンパイル)する手順 - Qiita

https://qiita.com/rkowase/items/8965bac34804e5e737fa