KOTLIN vs JAVA:Kotlinに今すぐスイッチするための8の機能

August 28, 2020

kotlin-vs-java-august-2020

はじめに

KotlinはJetBrainsによって開発された新しい言語であり、バックエンドとモバイルの両方で広く使用されています。 「先輩」であるJavaと異なる概念や構文が多くあるため、Kotlinは、Java開発者にとってアプローチが難しい言語と言われています。しかし、Google I/O 2019カンファレンスにて、Googleは、Androidアプリ開発においてKotlinを最優先することを公式に発表しました。

本記事では、一人のTBVメンバーがAndroidアプリケーション開発中に実感したKotlin 1.3の優れた機能をJava 8と比べて紹介したいと思います!

データクラス

オブジェクトタイプを定義するデータクラスには、フィールドのみが含まれ、処理メソッドは含まれません。 JavaのPOJOまたはDTOに似ていますが、Kotlinではより簡潔に宣言されています。

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

データクラスは、通常のクラス宣言を簡略化するだけでなく、以下のように必要なメソッドを自動的に生成します。

class ClassEmployee {
    var name: String = ""
    var age: Int = 0
}

上記のDataEmployeeとClassEmployeeはどちらも参照型です。 しかし、DataEmployeeは値オブジェクト(Value Object)のため、Kotlinは自動的にequalsメソッド(Object o)を生成します。したがって、すべてのフィールドが同じ場合、演算子(operator)==を使用するとtrueが返されます。

デフォルト引数

関数とクラスを定義するときに引数のデフォルト値を宣言することができます。 Javaでは同じような宣言はできません。

fun haveGirlFriend(val name: String = "Computer", val age: Int = 30)

LAZY LOAD

Kotlinは、遅延初期化メカニズム(lazy)を使用してクラスを初期化する時間を短縮します。変数は最初に使用されるときに初期化されます。 Javaでは同じような機能がありません。


val
rect: Rect by lazy { Rect(left, top, right, bottom) }

SINGLE-EXPRESSION FUNCTION(単一式関数)

Javaでは、関数が単純であっても複雑であっても、定義方法が一つしかありません。

//java
int sum
(int x, int y) {
return x + y;
}

Kotlinでは、単に1行で構成される関数の場合、以下のようにシンプルに定義できます。

//kotlin
fun
sum(x: Int, y: Int) = x + y

OBJECTとCOMPANION OBJECT

Global Object

Java開発者の皆さんは、Singletonでよくstaticキーワードを使用しているのでしょう。Kotlinでは全く異なります。

絶対的なオブジェクト指向言語ではないため、KotlinはJavaまたはC#と同じように、すべてオブジェクトとクラスを参照する必要がありません。

staticキーワード自体もオブジェクト指向性ではないため、Kotlinはこの機能を取り除きました。代わりに以下のようにグローバルオブジェクトを宣言することにしています。

object Helper {
    private var count = 0
    fun increasedCount(): Int = count++
}

// Use:
// println(Helper.increasedCount())

この宣言はJavaのstaticとは何が異なるでしょうか。

似ているように見えますが、KotlinのHelperのほうが本格的なオブジェクトであり、多くのインターフェースから継承できます。Javaのstaticはこのような機能がありません。

Companion Object

オブジェクト/メソッドを宣言しそれを既存クラス内のstaticメンバーとして使用する場合、
companion
キーワードを入れましょう。
companion object {
    private const val NAME = "Name"
 
    fun makeIntent(context: Context) = Intent(context, Activity::class.java)
 
    @JvmStatic
    fun makeIntentV2(context: Context) = Intent(context, Activity::class.java)
}

Javaクラスで上記の関数を使用するには、@JvmStaticが必要になります。

COLLECTION OPERATIONS

Java 8以降サポートされるlambdaと同様に、Kotlinはarray(配列)処理をサポートする一般的な操作を提供しますが、より簡潔でわかりやすい方法で記述できます。

例)filter、filterNotNull、map、flatMap、reverse、sortedなど

var list = mutableListOf(3, 6, 6, 7, 9)
var result = list.filter { it % 3 == 0 }
print(result)
 
// result: [3, 6, 6, 9]

SCOPE FUNCTION

Kotlinは、各オブジェクトコンテキストに応じてブロックコードを実行するスコープ関数(run、with、let、applyなど)を提供します。 これらの関数はさまざまな目的で使用され、上記のようにthisまたはitが適用されます。 正しく使用するには、以下の図を参照してください!

kotkin-vs-java-august-2020 

Non-Null型とNullable型

Javaでは、@ NonNullアノテーションでnullを自動的にチェックできるようになるのは、Java 8になってからでした。 その前、?(Nullable)が宣言されていないとき、データ型はデフォルトでNonNullになります。 Kotlinも、NonNullを使用してプログラミングにおける一般的なNullPointerExceptionエラーを最小限に抑えることを常に推奨しています。 ただし、Nullable型を使用する必要がある場合でも、KotlinはJavaより単純なnullチェッカーオペレーターをサポートしています。

var company: String? = "Techbase"
val a = company!!.length // a = 8
company = null
val b = company!!.length // throw NullPointerException
company = "Techbase"
val a = company?.length ?: -1 // a = 8
company = null
val b = company?.length ?: -1 // b = -1
company?.let {
    // do something if object is not null
}

今すぐKotlinに変えるべきか?

kotkin-vs-java-august-2020 
今すぐKotlinに変えるべきか? (画像引用元:jaxenter)

上記に挙げられた機能は、Kotlinの違い(Javaと比べる改善点でもあります)の一部にすぎません。 全体として、Kotlinは素晴らしい言語ですね。同じ開発のアイデアで、特にクラス/関数の定義に関して、KotlinはJavaよりコードの行数が少なく、可読性は高いです。つまり、開発時間を削ることができ、精度も高くなることが予想されます。

ほんの少しの問題は、Kotlinがまだ開発中の段階であることです。 新しいバージョンが出るたびに、前のsyntaxが変更され、新しいキーワードが追加されます(現在のキーワード量はJavaよりはるかに多い)。 そのため、たまに「Kotlin 1.xxxのアップグレード」というタスクが発生することがあります。しかし、このアップグレードはほとんどIDEが対応してくれるため、心配する必要はありません!

Java開発者の方はKotlinについていかがお考えでしょうか。Kotlinを試してみて、TBVに感想をシェアしていただければありがたいです!

参照元

https://kotlinlang.org/docs/reference/
https://try.kotlinlang.org/
https://github.com/Kotlin
https://medium.com/@elye.project/mastering-kotlin-standard-functions-run-with-let-also-and-apply-9cd334b0ef84