Android開発を後押しする10のKotlin機能

公開: 2022-03-11

序章

少し前に、TomaszはAndroidでKotlin開発を導入しました。 思い出してください。Kotlinは、最も人気のあるJavaIDEの1つであるIntelliJIDEAの背後にある会社であるJetbrainsによって開発された新しいプログラミング言語です。 Javaと同様に、Kotlinは汎用言語です。 Java仮想マシン(JVM)バイトコードに準拠しているため、Javaと並べて使用でき、パフォーマンスのオーバーヘッドは発生しません。

この記事では、Android開発を後押しするための便利な機能のトップ10について説明します。

:この記事の執筆時点では、実際のバージョンはAndroidStudio2.1.1でした。 およびKotlin1.0.2。

Kotlin

終わりのないJavaコードにうんざりしていませんか? Kotlinを試して、時間と正気を節約してください。
つぶやき

Kotlinのセットアップ

KotlinはJetBrainsによって開発されているため、AndroidStudioとIntelliJの両方で十分にサポートされています。

最初のステップは、Kotlinプラグインをインストールすることです。 これが正常に行われると、JavaをKotlinに変換するための新しいアクションが利用できるようになります。 2つの新しいオプションは次のとおりです。

  1. 新しいAndroidプロジェクトを作成し、プロジェクトにKotlinをセットアップします。
  2. Kotlinサポートを既存のAndroidプロジェクトに追加します。

新しいAndroidプロジェクトを作成する方法については、公式のステップバイステップガイドを確認してください。 新しく作成されたプロジェクトまたは既存のプロジェクトにKotlinサポートを追加するには、Macの場合はCommand + Shift + A A、Windows/Linuxの場合はCtrl + Shift + Aを使用してアクションの検索ダイアログを開き、[ Configure Kotlin in Project ]アクションを呼び出します。

新しいKotlinクラスを作成するには、次を選択します。

  • File > New > Kotlin file/class 、または
  • File > New > Kotlin activity

または、Javaクラスを作成し、上記のアクションを使用してKotlinに変換することもできます。 これを使用して、任意のクラス、インターフェイス、列挙型、またはアノテーションを変換できます。これを使用して、JavaをKotlinコードと簡単に比較できます。

多くの入力を節約するもう1つの便利な要素は、Kotlin拡張機能です。 それらを使用するには、モジュールbuild.gradleファイルに別のプラグインを適用する必要があります。

 apply plugin: 'kotlin-android-extensions'

警告:Kotlinプラグインアクションを使用してプロジェクトを設定している場合、トップレベルのbuild.gradleファイルに次のコードが配置されます。

 buildscript { ext.kotlin_version = '1.0.2' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }

これにより、拡張機能が機能しなくなります。 これを修正するには、Kotlinを使用する各プロジェクトモジュールにそのコードをコピーするだけです。

すべてを正しくセットアップすると、標準のAndroidプロジェクトと同じようにアプリケーションを実行およびテストできるようになりますが、現在はKotlinを使用しています。

Kotlinで時間を節約

それでは、Kotlin言語のいくつかの重要な側面を説明し、Javaの代わりにそれを使用して時間を節約する方法に関するヒントを提供することから始めましょう。

機能#1:静的レイアウトのインポート

Androidで最も一般的な定型コードの1つは、 findViewById()関数を使用して、アクティビティまたはフラグメントのビューへの参照を取得することです。

Butterknifeライブラリなど、入力を節約するソリューションがありますが、Kotlinは、1回のインポートでレイアウトからビューへのすべての参照をインポートできるようにすることで、これをさらに一歩進めます。

たとえば、次のアクティビティXMLレイアウトについて考えてみます。

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="co.ikust.kotlintest.MainActivity"> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>

および付随するアクティビティコード:

 package co.ikust.kotlintest import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) helloWorldTextView.text = "Hello World!" } }

定義されたIDを持つレイアウト内のすべてのビューの参照を取得するには、AndroidKotlin拡張機能Ankoを使用します。 次のインポートステートメントを入力することを忘れないでください。

 import kotlinx.android.synthetic.main.activity_main.*

Kotlinの行末にはオプションであるため、セミコロンを記述する必要がないことに注意してください。

レイアウトからのTextViewは、ビューのIDと同じ名前のTextViewインスタンスとしてインポートされます。 ラベルを設定するために使用される構文と混同しないでください。

 helloWorldTextView.text = "Hello World!"

これについては後ほど説明します。

警告

  • 正しいレイアウトをインポートするようにしてください。インポートしないと、インポートされたビュー参照の値がnullになります。
  • フラグメントを使用する場合は、インポートされたビュー参照がonCreateView()関数呼び出しのに使用されていることを確認してください。 onCreateView()関数でレイアウトをインポートし、ビュー参照を使用してonViewCreated()でUIを設定します。 onCreateView()メソッドが終了するまで、参照は割り当てられません。

機能#2:Kotlinを使用したPOJOクラスの作成

Kotlinで最も時間を節約できるのは、データを保持するために使用されるPOJO(Plain Old Java Object)クラスを作成することです。 たとえば、RESTfulAPIのリクエストとレスポンスの本文。 RESTful APIに依存するアプリケーションには、そのようなクラスがたくさんあります。

Kotlinでは、多くのことが行われ、構文は簡潔です。 たとえば、Javaの次のクラスについて考えてみます。

 public class User { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }

Kotlinを使用する場合、パブリックキーワードを再度記述する必要はありません。 デフォルトでは、すべてがパブリックスコープです。 たとえば、クラスを宣言する場合は、次のように記述します。

 class MyClass { }

上記のKotlinのJavaコードに相当します。

 class User { var firstName: String? = null var lastName: String? = null }

ええと、それは多くのタイピングを節約しますね? Kotlinコードを見ていきましょう。

Kotlinは多くのタイピングを節約します

Kotlinで変数を定義する場合、2つのオプションがあります。

  • varキーワードで定義された可変変数。
  • valキーワードで定義された不変変数。

次に注意すべきことは、構文がJavaとは少し異なることです。 まず、変数名を宣言してから、typeを続けます。 また、デフォルトでは、プロパティはnull以外のタイプです。つまり、 null値を受け入れることはできません。 null値を受け入れる変数を定義するには、型の後に疑問符を追加する必要があります。 これとnull-safetyについては後でKotlinで説明します。

注意すべきもう1つの重要な点は、Kotlinにはクラスのフィールドを宣言する機能がないことです。 プロパティのみを定義できます。 したがって、この場合、 firstNamelastNameは、デフォルトのゲッター/セッターメソッドが割り当てられたプロパティです。 前述のように、Kotlinでは、両方ともデフォルトで公開されています。

カスタムアクセサは、次のように記述できます。

 class User { var firstName: String? = null var lastName: String? = null val fullName: String? get() firstName + " " + lastName }

外部から見ると、構文に関しては、プロパティはJavaのパブリックフィールドのように動作します。

 val userName = user.firstName user.firstName = "John"

新しいプロパティfullNameは読み取り専用( valキーワードで定義)であり、カスタムゲッターがあることに注意してください。 単に名前と姓を追加するだけです。

Kotlinのすべてのプロパティは、宣言されたとき、またはコンストラクター内にあるときに割り当てる必要があります。 それが都合が悪い場合があります。 たとえば、依存性注入によって初期化されるプロパティの場合です。 その場合、 lateinit修飾子を使用できます。 次に例を示します。

 class MyClass { lateinit var firstName : String; fun inject() { firstName = "John"; } }

プロパティの詳細については、公式ドキュメントをご覧ください。

機能#3:クラスの継承とコンストラクター

Kotlinには、コンストラクターに関してもより簡潔な構文があります。

コンストラクター

Kotlinクラスには、1次コンストラクターと1つ以上の2次コンストラクターがあります。 プライマリコンストラクターの定義例:

 class User constructor(firstName: String, lastName: String) { }

プライマリコンストラクタは、クラス定義のクラス名の後に続きます。 プライマリコンストラクターにアノテーションまたは可視性修飾子がない場合は、コンストラクターキーワードを省略できます。

 class Person(firstName: String) { }

プライマリコンストラクタはコードを持つことができないことに注意してください。 初期化は、 initコードブロックで行う必要があります。

 class Person(firstName: String) { init { //perform primary constructor initialization here } }

さらに、プライマリコンストラクターを使用して、プロパティを定義および初期化できます。

 class User(var firstName: String, var lastName: String) { // ... }

通常のプロパティと同様に、プライマリコンストラクタから定義されたプロパティは不変( val )または可変( var )にすることができます。

クラスには2次コンストラクターも含まれる場合があります。 1つを定義するための構文は次のとおりです。

 class User(var firstName: String, var lastName) { constructor(name: String, parent: Person) : this(name) { parent.children.add(this) } }

すべてのセカンダリコンストラクタはプライマリコンストラクタに委任する必要があることに注意してください。 これは、 thisのキーワードを使用するJavaに似ています。

 class User(val firstName: String, val lastName: String) { constructor(firstName: String) : this(firstName, "") { //... } }

クラスをインスタンス化するときは、Javaのように、Kotlinにはnewキーワードがないことに注意してください。 前述のUserクラスをインスタンス化するには、次を使用します。

 val user = User("John", "Doe)

継承の紹介

Kotlinでは、すべてのクラスはAnyから拡張されます。これは、JavaのObjectに似ています。 デフォルトでは、Javaの最終クラスのように、クラスは閉じられます。 したがって、クラスを拡張するには、 openまたはabstractとして宣言する必要があります。

 open class User(val firstName, val lastName) class Administrator(val firstName, val lastName) : User(firstName, lastName)

拡張クラスのデフォルトコンストラクタに委任する必要があることに注意してください。これは、Javaの新しいクラスのコンストラクタでsuper()メソッドを呼び出すのと似ています。

クラスの詳細については、公式ドキュメントを確認してください。

機能#4:ラムダ式

Java 8で導入されたラムダ式は、そのお気に入りの機能の1つです。 ただし、AndroidではJava 7しかサポートされておらず、Java 8はまもなくサポートされないように見えるため、状況はそれほど明るくありません。 そのため、Retrolambdaなどの回避策は、ラムダ式をAndroidにもたらします。

Kotlinを使用すると、追加のライブラリや回避策は必要ありません。

Kotlinの機能

Kotlinの関数構文を簡単に確認することから始めましょう。

 fun add(x: Int, y: Int) : Int { return x + y }

関数の戻り値は省略できます。その場合、関数はIntを返します。 Kotlinのすべてがオブジェクトであり、 Anyから拡張されており、プリミティブ型がないことを繰り返す価値があります。

関数の引数には、次のようなデフォルト値を設定できます。

 fun add(x: Int, y: Int = 1) : Int { return x + y; }

その場合、 add()関数は、 x引数のみを渡すことで呼び出すことができます。 同等のJavaコードは次のようになります。

 int add(int x) { Return add(x, 1); } int add(int x, int y) { return x + y; }

関数を呼び出すときのもう1つの優れた点は、名前付き引数を使用できることです。 例えば:

 add(y = 12, x = 5)

関数の詳細については、公式ドキュメントを確認してください。

Kotlinでのラムダ式の使用

KotlinのLambda式は、Javaでは無名関数と見なすことができますが、構文はより簡潔です。 例として、JavaとKotlinでクリックリスナーを実装する方法を示しましょう。

Javaの場合:

 view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Clicked on view", Toast.LENGTH_SHORT).show(); } };

Kotlinの場合:

 view.setOnClickListener({ view -> toast("Click") })

おお! たった1行のコード! ラムダ式が中括弧で囲まれていることがわかります。 パラメータが最初に宣言され、本文は->記号の後に続きます。 クリックリスナーでは、ビューパラメータのタイプは推測できるため、指定されていません。 bodyは、Kotlinが提供するトーストを表示するためのtoast()関数の呼び出しにすぎません。

また、パラメータが使用されていない場合は、除外することができます。

 view.setOnClickListener({ toast("Click") })

KotlinはJavaライブラリを最適化しており、引数に対して1つのメソッドを持つインターフェイスを受け取る関数は、(インターフェイスの代わりに)関数引数を使用して呼び出すことができます。

さらに、関数が最後のパラメーターである場合は、括弧から外すことができます。

 view.setOnClickListener() { toast("Click") }

最後に、関数に関数であるパラメーターが1つしかない場合は、括弧を省略できます。

 view.setOnClickListener { toast("Click") }

詳細については、AntonioLeivaによるKotlinforAndroid開発者向けの書籍と公式ドキュメントを確認してください。

拡張機能

Kotlinは、C#と同様に、拡張関数を使用して既存のクラスを新しい機能で拡張する機能を提供します。 たとえば、 StringのMD5ハッシュを計算する拡張メソッド:

 fun String.md5(): ByteArray { val digester = MessageDigest.getInstance("MD5") digester.update(this.toByteArray(Charset.defaultCharset())) return digester.digest() }

関数名の前には拡張クラスの名前(この場合はString )が付いており、拡張クラスのインスタンスはthisキーワードを介して使用できることに注意してください。

拡張関数は、Javaユーティリティ関数と同等です。 Javaのサンプル関数は次のようになります。

 public static int toNumber(String instance) { return Integer.valueOf(instance); }

サンプル関数は、Utilityクラスに配置する必要があります。 つまり、拡張関数は元の拡張クラスを変更しませんが、ユーティリティメソッドを作成する便利な方法です。

機能#5:ヌルの安全性

Javaで最も苦労することの1つは、おそらくNullPointerExceptionです。 ヌルセーフティはKotlin言語に統合された機能であり、通常は心配する必要がないほど暗黙的です。 公式ドキュメントには、 NullPointerExceptionsの考えられる唯一の原因は次のとおりであると記載されています。

  • NullPointerExceptionをスローする明示的な呼び出し。
  • を使用して!! 演算子(後で説明します)。
  • 外部Javaコード。
  • 初期化される前にコンストラクターでlateinitプロパティにアクセスすると、 UninitializedPropertyAccessExceptionがスローされます。

デフォルトでは、Kotlinのすべての変数とプロパティは、明示的にnull可能として宣言されていない場合、null non-nullnull値を保持できない)と見なされます。 すでに述べたように、 null値を受け入れる変数を定義するには、型の後に疑問符を追加する必要があります。 例えば:

 val number: Int? = null

ただし、次のコードはコンパイルされないことに注意してください。

 val number: Int? = null number.toString()

これは、コンパイラがnullチェックを実行するためです。 コンパイルするには、 nullチェックを追加する必要があります。

 val number: Int? = null if(number != null) { number.toString(); }

このコードは正常にコンパイルされます。 この場合、Kotlinがバックグラウンドで行うことは、そのnumberがifブロック内でnun-nullIntではなくInt? )になることです。

nullチェックは、安全な呼び出し演算子?. )を使用して簡略化できます。

 val number: Int? = null number?.toString()

2行目は、数値がnullでない場合にのみ実行されます。 有名なエルビス演算子?: :)を使用することもできます。

 val number Int? = null val stringNumber = number?.toString() ?: "Number is null"

?:の左側の式がnullでない場合、評価されて返されます。 それ以外の場合は、右の式の結果が返されます。 もう1つの優れた点は、Elvis演算子の右側でthrowまたはreturnを使用できることです。これは、Kotlinの式であるためです。 例えば:

 fun sendMailToUser(user: User) { val email = user?.email ?: throw new IllegalArgumentException("User email is null") //... }

!! オペレーター

Javaと同じ方法でNullPointerExceptionをスローしたい場合は、 !!を使用してそれを行うことができます。 オペレーター。 次のコードはNullPointerExceptionをスローします:

 val number: Int? = null number!!.toString()

鋳造

asキーワードを使用してキャストインを実行します。

 val x: String = y as String

これは、Javaのようにキャストが不可能な場合に、 ClassCastExceptionをスローするため、「安全でない」キャストと見なされます。 例外をスローする代わりにnull値を返す「安全な」キャスト演算子があります。

 val x: String = y as? String

キャストの詳細については、公式ドキュメントの「型キャストとキャスト」セクションを確認してください。 nullの安全性の詳細については、「ヌルの安全性」セクションを確認してください。

lateinitプロパティ

lateinitプロパティを使用すると、 NullPointerExceptionと同様の例外が発生する場合があります。 次のクラスについて考えてみます。

 class InitTest { lateinit var s: String; init { val len = this.s.length } }

このコードは警告なしにコンパイルされます。 ただし、 TestClassのインスタンスが作成されるとすぐに、プロパティsが初期化される前にアクセスされるため、 UninitializedPropertyAccessExceptionがスローされます。

機能#6:関数with()

関数with()は便利で、Kotlin標準ライブラリに付属しています。 オブジェクトの多くのプロパティにアクセスする必要がある場合は、入力を節約するために使用できます。 例えば:

 with(helloWorldTextView) { text = "Hello World!" visibility = View.VISIBLE }

オブジェクトと拡張関数をパラメータとして受け取ります。 コードブロック(中括弧内)は、最初のパラメーターとして指定されたオブジェクトの拡張関数のラムダ式です。

機能#7:演算子のオーバーロード

Kotlinを使用すると、事前定義された一連の演算子にカスタム実装を提供できます。 演算子を実装するには、指定された名前のメンバー関数または拡張関数を指定する必要があります。

たとえば、乗算演算子を実装するには、 times(argument)という名前のメンバー関数または拡張関数を指定する必要があります。

 operator fun String.times(b: Int): String { val buffer = StringBuffer() for (i in 1..b) { buffer.append(this) } return buffer.toString() }

上記の例は、 Stringに対するbinary *演算子の実装を示しています。 たとえば、次の式は、値「TestTestTestTest」をnewString変数に割り当てます。

 val newString = "Test" * 4

拡張関数を使用できるため、すべてのオブジェクトの演算子のデフォルトの動作を変更できます。 これは両刃の剣であり、注意して使用する必要があります。 オーバーロードできるすべての演算子の関数名のリストについては、公式ドキュメントを確認してください。

Javaと比較したもう1つの大きな違いは、 ==および!=演算子です。 演算子==は次のように変換されます:

 a?.equals(b) ?: b === null

一方、演算子!=は次のように変換されます。

 !(a?.equals(b) ?:

つまり、 ==を使用しても、JavaのようにIDチェックは行われません(オブジェクトのインスタンスが同じかどうかを比較してください)が、 nullチェックとともにequals()メソッドと同じように動作します。

IDチェックを実行するには、Kotlinで演算子===および!==を使用する必要があります。

機能#8:委任されたプロパティ

特定のプロパティは、いくつかの一般的な動作を共有します。 例えば:

  • 最初のアクセス時に初期化される遅延初期化プロパティ。
  • ObservableinObserverパターンを実装するプロパティ。
  • 代わりに個別のフィールドとしてマップに保存されるプロパティ。

このようなケースの実装を容易にするために、KotlinはDelegatedPropertiesをサポートしています

 class SomeClass { var p: String by Delegate() }

これは、プロパティpのgetterおよびsetter関数が、別のクラスのインスタンスであるDelegateによって処理されることを意味します。

Stringプロパティのデリゲートの例:

 class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "$thisRef, thank you for delegating '${property.name}' to me!" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } }

上記の例では、プロパティが割り当てられたとき、またはプロパティが読み取られたときにメッセージが出力されます。

デリゲートは、可変( var )プロパティと読み取り専用( val )プロパティの両方に対して作成できます。

読み取り専用プロパティの場合、 getValueメソッドを実装する必要があります。 これには2つのパラメーターが必要です(公式ドキュメントから取得)。

  • レシーバー-プロパティ所有者と同じかスーパータイプである必要があります(拡張プロパティの場合、拡張されるタイプです)。
  • メタデータ-タイプKProperty<*>またはそのスーパータイプである必要があります。

この関数は、プロパティまたはそのサブタイプと同じタイプを返す必要があります。

可変プロパティの場合、デリゲートは、次のパラメーターをsetValueという名前の関数を追加で提供する必要があります。

  • レシーバーgetValue()の場合と同じです。
  • メタデータgetValue()の場合と同じです。
  • 新しい値-プロパティまたはそのスーパータイプと同じタイプである必要があります。

Kotlinには、最も一般的な状況をカバーする標準のデリゲートがいくつかあります。

  • 怠惰
  • 観察可能
  • Vetoable

怠惰

Lazyは、ラムダ式をパラメーターとして受け取る標準​​のデリゲートです。 渡されたラムダ式は、 getValue()メソッドが最初に呼び出されたときに実行されます。

デフォルトでは、レイジープロパティの評価は同期されます。 マルチスレッドに関心がない場合は、 lazy(LazyThreadSafetyMode.NONE) { … }を使用してパフォーマンスを向上させることができます。

観察可能

Delegates.observable()は、ObserverパターンでObservablesとして動作する必要があるプロパティ用です。 初期値と3つの引数(プロパティ、古い値、新しい値)を持つ関数の2つのパラメーターを受け入れます。

指定されたラムダ式は、 setValue()メソッドが呼び出されるたびに実行されます。

 class User { var email: String by Delegates.observable("") { prop, old, new -> //handle the change from old to new value } }

Vetoable

この標準デリゲートは、プロパティに割り当てられた新しい値を保存するかどうかを決定できる特別な種類のObservableです。 値を割り当てる前に、いくつかの条件を確認するために使用できます。 Delegates.observable()と同様に、初期値と関数の2つのパラメーターを受け入れます。

違いは、関数がブール値を返すことです。 trueを返す場合、プロパティに割り当てられた新しい値が保存されるか、そうでなければ破棄されます。

 var positiveNumber = Delegates.vetoable(0) { d, old, new -> new >= 0 }

与えられた例は、プロパティに割り当てられた正の数のみを格納します。

詳細については、公式ドキュメントを確認してください。

機能#9:オブジェクトをマップにマッピングする

一般的な使用例は、プロパティの値をマップ内に格納することです。 これは、RESTful APIと連携し、JSONオブジェクトを解析するアプリケーションでよく発生します。 この場合、マップインスタンスは、委任されたプロパティの委任として使用できます。 公式ドキュメントの例:

 class User(val map: Map<String, Any?>) { val name: String by map val age: Int by map }

この例では、 Userにはマップを取得するプライマリコンストラクターがあります。 2つのプロパティは、プロパティ名と同じキーの下にマップされているマップから値を取得します。

 val user = User(mapOf( "name" to "John Doe", "age" to 25 ))

新しいユーザーインスタンスのnameプロパティには、「John Doe」の値が割り当てられ、ageプロパティには値25が割り当てられます。

これは、 MutableMapと組み合わせたvarプロパティでも機能します。

 class MutableUser(val map: MutableMap<String, Any?>) { var name: String by map var age: Int by map }

機能#10:コレクションと機能操作

Kotlinでのラムダのサポートにより、コレクションを新しいレベルに活用できます。

まず、Kotlinは可変コレクションと不変コレクションを区別します。 たとえば、 Iterableインターフェイスには次の2つのバージョンがあります。

  • 反復可能
  • MutableIterable

コレクションリストセットマップの各インターフェースについても同じことが言えます。

たとえば、このany操作は、少なくとも1つの要素が指定された述語に一致する場合にtrueを返します。

 val list = listOf(1, 2, 3, 4, 5, 6) assertTrue(list.any { it % 2 == 0 })

コレクションで実行できる機能操作の広範なリストについては、このブログ投稿を確認してください。

結論

Kotlinが提供するものの表面をかじったところです。 さらに読んでさらに学ぶことに興味がある人は、以下を確認してください。

  • AntonioLeivaのKotlinブログ投稿と本。
  • JetBrainsの公式ドキュメントとチュートリアル。

要約すると、Kotlinは、直感的で簡潔な構文を使用して、ネイティブAndroidアプリケーションを作成する際の時間を節約する機能を提供します。 それはまだ若いプログラミング言語ですが、私の意見では、本番アプリの構築に使用できるほど安定しています。

Kotlinを使用する利点:

  • Android Studioによるサポートは、シームレスで優れています。
  • 既存のJavaプロジェクトをKotlinに変換するのは簡単です。
  • JavaとKotlinのコードが同じプロジェクトに共存する場合があります。
  • アプリケーションには速度のオーバーヘッドはありません。

欠点:

  • Kotlinは生成された.apkにライブラリを追加するため、最終的な.apkサイズは約300KB大きくなります。
  • 悪用されると、演算子のオーバーロードによりコードが読み取れなくなる可能性があります。
  • IDEとオートコンプリートは、Kotlinを使用する場合、純粋なJavaAndroidプロジェクトを使用する場合よりも動作が少し遅くなります。
  • コンパイル時間は少し長くなる可能性があります。