LoginSignup
10
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-17
1 / 22

自プロダクトに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

10
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14