ホームページ > Java > &#&チュートリアル > Java 開発者のための Kotlin (パート 1)

Java 開発者のための Kotlin (パート 1)

Mary-Kate Olsen
リリース: 2025-01-27 16:04:17
オリジナル
883 人が閲覧しました

Kotlin for Java Developers (Part 1)

Java はプログラミング言語の中で優勢であるため、Java 開発者が Kotlin を使用中に同じ間違いを犯しているのを何度も見かけます。誤解しないでください。これは、これらがバグであると言っているのではなく、開発者が Java での開発に慣れていて Kotlin の機能を活用していない場合、Kotlin で「コードの臭い」が発生する傾向があるということです。

この記事では、私がよく目にするコードの匂いと、それを「Kotlin 方式」で理想的に実装する方法について説明します。

このシリーズのパート 1 では以下について説明します:

  • データ クラスを使用する
  • 空のセキュリティを使用する
  • デフォルトで不変性

データ クラスを使用する

私の Java 開発者にもレコード クラスの使用経験がある人が増えてくると、このトピックはすぐに消えるかもしれません。それでも、Java レコードと Kotlin データ クラスの間にはいくつかの違いがあります。

Java メソッド:

<code class="language-java">public class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  // Getters, setters, ...
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

または記録のために:

<code class="language-java">public record Person(
    String name,
    int age
) {
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Kotlin の方法:

<code class="language-kotlin">data class Person(val name: String, var age: Int)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Java レコードと Kotlin データ クラスの間には、知っておくとよい相違点がいくつかあります。

  • Java レコードと Kotlin データ クラスは両方とも不変のデータ キャリアです。
  • Java では、フィールドは暗黙的に最終的なものであり、構築後に変更することはできません。一方、Kotlin では、val または var を使用してフィールドを変更可能にするかどうかを選択できます。
  • もう 1 つの違いは、Java のレコード クラスは暗黙的に Final でシールされており、拡張できないことを意味しますが、Kotlin ではデータ クラスを拡張できることです。
  • Kotlin では、Java では不可能な、equals、hashCode、toString メソッドをオーバーライドすることもできます。
  • Kotlin は、Java では使用できない、すぐに使用できる copy メソッドを提供します。

いくつかの例:

Java でオブジェクトをコピー

<code class="language-java">Person p2 = new Person(p1.getName(), p1.getAge());</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Kotlin:

<code class="language-kotlin">val p2 = p1.copy(age = 42)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

または Java での宣言の構造化:

<code class="language-java">String name = p1.getName();
int age = p1.getAge();</code>
ログイン後にコピー
ログイン後にコピー

Kotlin:

<code class="language-kotlin">val (name, age) = p1
println(name) // "John"
println(age) // 42</code>
ログイン後にコピー
ログイン後にコピー

参考

  • Kotlin データ クラス
  • Baeldung: Kotlin データ クラス

空のセキュリティを使用する

私の意見では、Kotlin の null 安全性は最も強力な機能の 1 つです。これは、時間と手間を大幅に節約する画期的な機能です。 Kotlin では、null 安全性が型システムに組み込まれているため、null 関連のランタイム エラーを回避しやすくなります。

1. Null 可能型

Kotlin では、null 許容型は明示的に宣言されます。これは、null 値を保持できる変数を持つことができますが、それを宣言で明示的に指定する必要があることを意味します。

null 非許容型 (デフォルトの動作)

デフォルトでは、Kotlin のすべての型は null 非許容です。つまり、変数は null 値を保持できません。

<code class="language-kotlin">val name: String = "John" // 不可空
name = null // 编译错误!</code>
ログイン後にコピー
ログイン後にコピー

Nullable 型

NULL 値を保持できる変数を宣言するには、? 演算子を使用する必要があります。

<code class="language-kotlin">val name: String? = null // 可空</code>
ログイン後にコピー

2. 安全な通話

強力な機能は、安全な通話オペレーター? です。これにより、NullPointerException をスローせずに、安全にメソッドを呼び出したり、プロパティにアクセスしたりできるようになります。

<code class="language-java">public class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  // Getters, setters, ...
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

?.operator は、オブジェクトが空かどうかをチェックし、空の場合はすぐに null を返し、そうでない場合はメソッドの呼び出しまたはプロパティへのアクセスを続けます。オブジェクトが空の場合、式全体が null と評価されます。

3. エルヴィス演算子 (?:)

Elvis 演算子?: 演算子の左側の式が空の場合にデフォルト値を返す略語です。

<code class="language-java">public record Person(
    String name,
    int age
) {
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

4. !! 演算子 (非 null アサーション)

!! 演算子を使用して、値が null ではないことをコンパイラーに伝えることができます。値が null の場合は、NullPointerException がスローされます。

<code class="language-kotlin">data class Person(val name: String, var age: Int)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ヒント: この !! 演算子の使用は、null 安全性の目的に反しているため、非推奨です。

5. 関数パラメータの null 許容性

関数を定義するときに、パラメーターを null にできるかどうかを指定できます。この場合、呼び出し側が処理する必要があります。

<code class="language-java">Person p2 = new Person(p1.getName(), p1.getAge());</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

6. 安全な変換 (as? 演算子)

? として安全な変換演算子があり、変換が不可能な場合は null を返します。

<code class="language-kotlin">val p2 = p1.copy(age = 42)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

7. ラムダ式における Null の安全性

ラムダ式や高階関数で null 安全機能を使用することもできます。

<code class="language-java">String name = p1.getName();
int age = p1.getAge();</code>
ログイン後にコピー
ログイン後にコピー

8. let 関数を使用する

let 関数は、null 以外のオブジェクトでコードのブロックを実行できるようにするスコープ関数です。これは、安全な方法で null 許容オブジェクトのコードを実行するためによく使用されます。

例とデフォルト値:

<code class="language-kotlin">val (name, age) = p1
println(name) // "John"
println(age) // 42</code>
ログイン後にコピー
ログイン後にコピー

9. ベストプラクティス

  • !! 演算子の使用は避けてください
  • 安全な呼び出しと Elvis 演算子を使用して、null 許容型を安全に処理し、デフォルト値を提供します
  • 必要な場合にのみ null 許容型を使用してください

参考:

  • Kotlin Null の安全性

デフォルトで不変性

Kotlin は関数型プログラミング スタイルを強く推奨しています。関数型プログラミング スタイルの場合、不変性は、特にマルチスレッド アプリケーションでエラーを回避する上で重要な役割を果たします。

おそらく Kotlin または Java での関数型プログラミングについては別の記事を書くことになると思いますが、今は不変性に焦点を当てましょう。

Kotlin は基本的に、可変オブジェクトよりも不変オブジェクトを好みます。これにより、特に同時実行環境において、コードがよりシンプルで予測可能になります。

1. デフォルトで不変である変数 (val)

Kotlin では、val キーワードを使用して宣言された変数はデフォルトで不変です。これは Java での最終変数の宣言に非常に似ていますが、いくつかの重要な違いがあります。

    Kotlin の val 変数は実際には読み取り専用であり、それに割り当てられた値は初期化後に変更できません。
  • ただし、値がオブジェクトの場合、プロパティ自体が val として宣言されていない限り、オブジェクトのプロパティは変更できます。

例:

<code class="language-kotlin">val name: String = "John" // 不可空
name = null // 编译错误!</code>
ログイン後にコピー
ログイン後にコピー
Java との違い: Java では、変数が再割り当てできないようにするために、final キーワードを使用しますが、変数が指すオブジェクトは引き続き変更可能です。 Kotlin の主な違いは、不変性がデフォルトで変数にまで拡張され、アプリケーション全体のより予測可能で安全な設計が促進されることです。

変数変数の例:kotlinでvarキーワードを使用して、変数を再起動できるようにします。

<code class="language-java">public class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  // Getters, setters, ...
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ヒント: Kotlinは、非債務を確保するために、VARの代わりにできるだけ多くを奨励しています。

2。不変のコレクション

デフォルトでは、uncralacteriaを使用することも奨励されています。特徴的なセットは、作成後の変更を防ぎます。listof()を使用してリストを作成することはできません。要素を追加、削除、または変更することはできません。

<code class="language-java">public record Person(
    String name,
    int age
) {
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コレクションを変更する必要がある場合は、MutableListof()またはその他の変数コレクションタイプを使用できます。

<code class="language-kotlin">data class Person(val name: String, var age: Int)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
Javaの違い:Javaでは、コレクション(ArrayListなど)はデフォルトで変動します。つまり、要素を自由に変更できます。

3。変数データカテゴリの不可能

Kotlinのデータクラスはデフォルトで不可能です。データクラスを定義するとき、属性は通常VALとして宣言され、クラスを変更しません。これにより、特にAPI、データベースレコード、または作成後に変更されるべきではないその他のオブジェクトステータスを扱う場合、クラスは値オブジェクトに非常に適しています。

<code class="language-java">Person p2 = new Person(p1.getName(), p1.getAge());</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
<code class="language-kotlin">val p2 = p1.copy(age = 42)</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
4。シーリングクラスの不満足

Kotlinのシーリングクラスも不変であり、持続していないデータモデルとよく一致しています。シーリングクラスは通常、ステータスや応答などの限られたクラス構造を表すために使用され、その不道徳は状態または結果が誤って変更されないことを保証します。

以上がJava 開発者のための Kotlin (パート 1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート