JavaRush /Java Blog /Random-JA /コーヒーブレイク#121。Java のクラスパスとは何ですか?また、そのインストール方法は何ですか? Java に...

コーヒーブレイク#121。Java のクラスパスとは何ですか?また、そのインストール方法は何ですか? Java における不変性

Random-JA グループに公開済み

Java のクラスパスとは何ですか?また、そのインストール方法は何ですか?

出典: Medium プログラミングの基本とプログラム ファイルの実行フローを知ることは、言語を理解するのに役立ちます。Classpathパラメータを理解することは、すべての Java 開発者が知っておくべき基本概念の 1 つです。今日は、クラスパス ( Classpath ) とは何か、その設定方法、および JVM によるクラス ファイルの実行にどのように役立つかについて説明します。 コーヒーブレイク#121。 Java のクラスパスとは何ですか?また、そのインストール方法は何ですか?  Java の不変性 - 1

クラスパスとは何ですか?

クラスパスは Java の基本パラメータの 1 つですが、プログラミングの初心者にはよく誤解されます。単純化すると、クラスパスは単に、Java コンパイラーと JVM が他のクラスをコンパイルまたは実行するために必要なクラスを見つける必要がある 一連のパスです。

JVM がクラス ファイルを実行する際に Classpath がどのように役立つか

例から始めましょう。/Users/vikram/Documents/test-java/src/com/programming/v1/Main.javaフォルダーにMain.javaファイルがあると仮定します。
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
/Users/vikram/Documents にいて、このクラスをコンパイルしたいとします。
javac test-java/src/com/programming/v1/Main.java
このクラス ファイルを実行するには、クラスパスまたはJavaコマンドのcpフラグを使用して、.classファイル を探す場所を Java 仮想マシンに指示する必要があります。
vg@lp1 Documents % java -cp "test-java/src" com.programming.v1.Main
Hello classpath
vg@lp1 Documents % java -classpath "test-java/src" com.programming.v1.Main
Hello classpath
最初のパラメーターは、パッケージが書き込まれるルート フォルダーです。2 番目のパラメータは、クラス名を含むパッケージ名です。Java コマンドが実行されると、Java 仮想マシンはtest-java/srcフォルダーを調べ、メイン クラスをロードして実行します。

クラスパス変数の設定方法

Linux マシンでは、クラスパス変数を次のように設定できます。
export CLASSPATH="test-java/src"
Windows マシン上のクラスパスは、環境変数を使用して追加/更新できます。 環境変数を設定したら、次のように javaコマンドを実行できます。
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Classpath について知っておくべきことはこれですべてです。読んでくれてありがとう!

Java における不変性

出典: Medium Java の変数には、プリミティブと参照の 2 つのタイプがあります。Java ではすべて値によって渡されますが、参照型の場合は、渡されたメモリ アドレスを使用してソース データを更新できます。 Finalコーヒーブレイク#121。 Java のクラスパスとは何ですか?また、そのインストール方法は何ですか?  Java の不変性 - 2キーワードは、変数を定数として機能させる、つまり再代入を避けるために使用されます。これはヒープ メモリを持たないプリミティブにはうまく機能しますが、参照型の場合は再割り当てのみが制限され、内部状態を変更できます。これにより、多くの同時実行の問題や競合状態が発生する可能性があります。したがって、Java の通常の型に不変の特性を含めると、多くの利点が得られます。

Java における不変性の利点

1. スレッドの安全性

不変型は、オブジェクトの作成後に一貫性が保たれるため、マルチスレッド環境における競合状態の影響を受けません。複数のスレッドは内部状態を変更できないため、同期は必要ありません。

2. 基本型

Java 標準ライブラリの文字列は、基本クラスの良い例です。これは非常にシンプルで不変のクラスであり、その上にビジネス ロジック ドメインを構築するために使用できます。同様に、不変型は、構築の基礎となる優れた基本型として機能します。

特徴

1.プライベートフィールドとファイナルフィールド

オブジェクトの状態を含むフィールドは、privateおよびFinalです。プライベート可視性ではフィールドに直接アクセスできませんが、最終可視性ではフィールドが 1 回だけ割り当てられる ことが保証されます。

2. 修飾子メソッドはありません

プライベートフィールドにはクラス外からアクセスできません。通常、フィールドの読み取りと書き込みのために、アクセス メソッド (ゲッター) と修飾子メソッド (セッター) がそれぞれ提供されます。一貫性を確保するため、修飾子は使用できません。

3. 最終授業

クラスの継承を許可すると、不変性が損なわれる可能性があります。不変クラスを拡張したサブクラスは、オブジェクトの状態に影響を与える可能性があります。したがって、クラスはFinalです。

4. 防御コピー

オブジェクトの作成時に、コンストラクターからプライベート フィールドに引数を直接割り当てる代わりに、引数のディープ コピー (または不変のコピー) を作成すると、外部変更が可能になります。引数の 1 つが参照型の場合、呼び出し側で簡単に操作できます。保護コピーを作成すると、この操作を回避できます。同様に、アクセサー (ゲッター) の場合、内部フィールドを直接参照する代わりに、そのコピーを自由に共有できます。

実装

従業員

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public final class Employee {

    private final long id;
    private final String name;
    private final LocalDate joinDate;
    private final List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public LocalDate getJoinDate() {
        return joinDate;
    }

    public List<String> getAchievements() {
        return achievements;
    }
}
  • すべてのフィールドがコンストラクターに保護コピーを持っているわけではありません。これは、 idがプリミティブであり、name フィールドjoinDateフィールドが不変型であるためです。これらは呼び出し元によって変更できず、変更されないままになりますが、実績フィールドにはList.copyOfメソッドを使用して作成された引数のコピーが必要です。これは、 copyOf が不変のListを返すためです。

  • 同様に、アクセサー メソッドは、すべてのフィールド型が不変 (実績を含む) であり、クラス外で変更できないため、防御的なコピーではなくフィールドを直接返します。

改善点

Java 16 より前

Employee の実装は、Lombokなどのライブラリを使用して改善できます。これにより、コードの冗長さが軽減され、見た目がすっきりします。ライブラリには、標準コードを短縮するためのアノテーションが付属しています。@Value (アノテーション) を使用して、すべての引数のゲッターとコンストラクターを作成できます。これにより、finalクラス、 privateフィールド、finalフィールドも作成されます。注意として、toString メソッドequals メソッド、およびhashCodeメソッドも生成します。Employee実装は、以下に示すように@Valueを使用して書き換えることができます。
import lombok.Value;

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

@Value
public class Employee {

    long id;
    String name;
    LocalDate joinDate;
    List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

Java 16 以降

Java 16 リリースでは、新しいレコード機能が導入されました。これらは (JEP が述べているように) 不変データの透過的なキャリアとして機能するクラスであり、名目上のタプルと考えることができます。以下に示すように、 Employeeクラスをレコード Employeeとして再実装できます。
import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public record Employee(long id,
                       String name,
                       LocalDate joinDate,
                       List<String> achievements) {

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

欠陥

不変性の唯一の問題は、たとえ小さな変更であっても追加のメモリと処理が必要になることです。毎回新しいオブジェクトを作成する必要があり、非常にコストがかかる可能性があります。この欠点を回避するには、結果のキャッシュや保存などのメカニズムを実装できます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION