JavaとKotlin
1. 概要
Java 以外に、 Kotlin 、 Groovy 、Scalaなどのいくつかのプログラミング言語はJVMでネイティブに実行されます。
この記事では、2つの人気のあるJavaプログラミング言語であるJavaとKotlinを比較します。
2. Java固有の機能
2.1. チェックされた例外
Javaは、コードで宣言およびキャッチする必要があるチェック済み例外をサポートしています。 したがって、Java開発者は、コード内のエラーを処理することにより、より堅牢なコードを保証します。
2.2. プリミティブタイプ
Javaには、事前定義されたデータ型であるプリミティブ型が含まれています。 したがって、プリミティブ型で宣言された変数はオブジェクトではありません。
さらに、Javaには8つのプリミティブデータ型があります: int 、 byte 、 short 、 double 、 float 、[ X128X] boolean 、 char 、およびlong。
2.3. ワイルドカードタイプ
Javaは、タイプ指定子に疑問符(?)を配置することにより、ワイルドカードタイプの使用をサポートします。 したがって、未知のタイプのローカル変数、パラメーター、フィールド、または戻り値を示唆しています。
2.4. 三項演算子
Javaの三項演算子?: は、値を返すif-else条件の凝縮された代替であり、より短く、より読みやすく、より明確なコードを提供します。
ただし、内部的には、Javaはif-else条件とまったく同じように三項演算子をコンパイルします。
2.5. 静的メンバー
Javaは静的メンバーをサポートします。これは、そのようなインスタンスが1つだけ作成され、クラスのすべてのインスタンス間で共有されることを意味します。
2.6. 暗黙の拡大変換
Javaは、widening変換を暗黙的にサポートします。 したがって、は、小さいサイズのデータ型から大きいサイズのデータ型への変換を可能にします。
2.7. 非プライベートフィールド
Javaは非プライベートフィールドまたはパブリックフィールドを許可します—開発者がどこからでもアクセスを許可したいシナリオで便利です。
3. Kotlin固有の機能
3.1. データクラス
Kotlinは、クラス定義でdataキーワードを定義することにより、データクラス(一部のデータを保持することを目的としています)をサポートします。 そのため、コンパイラはデータクラスのゲッター/セッターとコンストラクターを自動生成します。 ただし、Java 14以降、 recordキーワードを使用して、Javaで不変のデータクラスを定義できます。
3.2. 文字列テンプレート
Kotlinは、文字列テンプレート–埋め込み式を含む文字列リテラルをサポートしています。 また、埋め込み式の値が決定され、実行時に文字列に連結されます。
3.3. プライマリコンストラクタ
Kotlinはプライマリコンストラクターをサポートしています。 Kotlinクラスには、必要に応じて、プライマリコンストラクターに加えて、セカンダリコンストラクターを含めることができます。
3.4. シングルトン
Kotlinを使用すると、オブジェクトを宣言するだけでシングルトンを簡単に宣言できます。 さらに、シングルトンオブジェクトの初期化は最初のアクセスで行われ、スレッドセーフでもあります。
3.5. 範囲式
Kotlinは、rangeTo関数(..として表される)を使用した範囲式をサポートします。これは、値の範囲を作成および反復するのに便利であるため、短くて読みやすいコードを促進します。
同様に、 downTo演算子を使用して、範囲を逆の順序で繰り返すことができます。
3.6. 演算子のオーバーロード
Kotlinは、types で事前定義された演算子のセットのカスタム実装を定義することにより、演算子のオーバーロードをサポートします。
3.7. 暗黙の委任
Kotlinは、継承デザインパターンの構成を利用することにより、暗黙的な委任をサポートします。 さらに、クラスの委任は、多重継承を持つ可能性を提供します。
3.8. 後続のラムダ
ラムダを最後のパラメーターとして関数に渡す場合、括弧の外側にラムダを渡すことができます。 Kotlinのラムダに関する記事LambdaLiteral Outside theBracketsに例があります。
3.9. 単一パラメーターのラムダ
Kotlinでは、短縮変数 it を使用して、ラムダ内の単一パラメーターを参照できます。
3.10. 中置記法
パラメータが1つしかない関数は、中置関数として宣言できます。 これにより、括弧なしで呼び出すことができ、関数呼び出しが自然言語のように見えます。
3.11. 名前付きおよびデフォルトの引数
Kotlinは、メソッドのオーバーロードに代わるものを提供します。 関数には名前付きパラメーターを含めることができます。これにより、パラメーターを異なる順序で関数を呼び出すことができます。 また、名前付きパラメーターを使用すると、コードの可読性を向上させることができます。 このトピックの詳細については、記事Kotlinのデフォルトおよび名前付き引数のクイックガイドを参照してください。
3.12. 怠惰な初期化
Kotlinは、オブジェクトの遅延初期化の組み込みサポートを提供します。 この興味深い機能の詳細については、記事Kotlinでのレイジー初期化をご覧ください。
4. Javaと Kotlin
4.1. 簡潔
Javaは、コードの記述において、従来の冗長性のアプローチに従います。 ただし、最新のプログラミング言語であるKotlinは、簡潔さの原則を適用しています。
簡潔さで知られるKotlinを使用すると、ボイラープレートコードの量を大幅に減らすことができ、Javaの同等のコードよりもコード行が少なくなります。 したがって、Kotlinは読みやすく、人為的なエラーが発生しにくくなっています。
4.2. ヌルセーフティ
Javaでは、null値をオブジェクトに割り当てることができます。 したがって、 null 参照のメンバーにアクセスすると、最も悪名高いNullPointerExceptionが発生します。
ただし、 Kotlinでは、デフォルトでnull値を設定することはできません。 したがって、Kotlinは、ヌルの安全性を実践することにより、より優れたコード安定性を提供します。
4.3. 拡張機能
Javaでメソッドを拡張するには、クラスを継承してオーバーライドする必要があります。 ただし、Kotlinには、クラスの継承を必ずしも必要としない拡張関数の機能が付属しています。
4.4. 厳格vs。 静的な入力
Javaは厳密に型指定された言語です。つまり、すべての変数は作成時に型で宣言されます。 一方、 Kotlinは静的に型付けされた言語であり、割り当て値のタイプに基づいて変数のタイプを決定できます。
4.5. スマートキャスティング
Javaの場合、開発者は変数のタイプをチェックし、操作ごとにそれに応じてキャストする必要があります。
ただし、Kotlinには、コンパイラが自動的に管理するスマートキャスト機能が付属しています。
4.6. 関数型プログラミング
Javaはオブジェクト指向プログラミング言語ですが、KotlinはOOPと関数型プログラミング言語の両方の動作を特徴としています。
たとえば、Javaと比較すると、Kotlinのインライン関数でLambda式を使用できます。 さらに、Kotlinは、デリゲートや拡張機能などの他の関数型プログラミング機能をサポートしています。
4.7. コルーチンのサポート
Javaを使用すると、バックグラウンドで複数のスレッドを作成して、長時間実行され、CPUを集中的に使用する操作を実行できます。 ただし、複数のスレッドを管理するのは複雑な作業です。
一方、 Kotlinには、特定の時点でブロッキングスレッドの実行を一時停止できるコルーチンサポートがあります。
4.8. 封印されたクラス
Kotlinは、最初から封印されたクラスの概念を実装していました。 Javaは、Java 15のプレビュー機能として封印されたクラスを導入しました。Java17の時点で、封印されたクラスは完全に言語の一部です。 2つの記事Kotlinの封印されたクラスとJava15の封印されたクラスとインターフェースは、両方の言語の封印されたクラスをカバーしています。 ここでは、JavaとKotlinの実装の主な違いについて簡単に説明します。
- Javaでは、同じモジュール内のクラスのみが封印されたクラスから継承できます。 Kotlinでは、サブクラスを同じファイルで定義する必要があります。
- Javaでは、封印されたクラスは、どのクラスがそれを拡張できるかを明示的に定義する必要があります。 そのために、予約済みの識別子permitを使用できます。 Kotlinでは、同じファイル内のすべてのクラスが封印されたクラスから継承できます。
- Kotlinでは、オブジェクトのタイプを switch ステートメントで使用できますが、JavaではswitchステートメントのパターンマッチングがJava17のプレビュー機能としてのみ導入されています。
4.9. コンパイル時間
Javaコンパイル時間はKotlinより15-20% fasterです。 ただし、インクリメンタルビルドコンパイルを検討すると、KotlinはJavaと同様のコンパイルパフォーマンスを示します。
4.10. プラットフォームの互換性
Javaは、JVMのバイトコードにコンパイルされ、NashornおよびRhinoJSエンジンを使用してJavaScriptにもコンパイルされます。 ただし、KotlinはバイトコードとJavaScriptだけでなく、ネイティブコードのコンパイルもサポートしています。
また、Kotlinマルチプラットフォームフレームワークを使用して、すべてのプラットフォームと互換性のある1つの共通コードベースを抽出できます。
4.11. ユースケース
ご存知のように、Javaは最も汎用的なJVMプログラミング言語です。 したがって、通常、スタンドアロンアプリケーションやバックエンドアプリケーションなどのさまざまなプロジェクトで好まれます。
一方、Kotlinは、Android開発で最も好まれる言語でもある、もう1つの人気のあるプログラミング言語です。
5. 結論
この記事では、JavaとKotlinの2つのJVMプログラミング言語を比較しました。
最初に、JavaとKotlinの両方のいくつかの特定の機能を調べました。 次に、2つを直接比較しました。