検索
ホームページJava&#&ベースJavaの不変クラスとその作成ルール

Javaの不変クラスとその作成ルール

Dec 03, 2019 pm 04:57 PM
java作成するルール

Javaの不変クラスとその作成ルール

不変クラスは、その名前が示すように、このクラスがインスタンス化された後に再割り当てできないことを意味します。java および java.lang.String# によって提供される 8 つのパッケージ化クラス## カテゴリを変更することはできません。

カスタムの不変クラスを作成するときに従うべきルール:

1. メンバー変数を変更するには、private および Final を使用します。

2. メンバー変数を初期化するためのパラメーター化されたコンストラクターを提供します。

3. メンバー変数にはセッター メソッドを提供しないでください。

4. メンバ変数に変数クラスがある場合は、ObjectのhashCodeメソッドとequalsメソッドを書き換える必要があります。

Java ビデオ チュートリアルの推奨事項:

Java 学習

例: 不変の Person クラスを作成する

public class Person {
    private final String Name;
    private final String gender;
    
    /*
     * 无参构造方法
     */
    public Person(){
        this.Name="";
        this.gender="";
    }
    /*
     * 有参构造方法
     */
    public Person(String Name , String gender){
        this.Name = Name;
        this.gender = gender;
    }
    public String getName() {
        return Name;
    }
    public String getGender() {
        return gender;
    }
    /*
     * 重写hashCode方法
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        return Name.hashCode() + gender.hashCode();
    }
    /*
     * 重写equals方法
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if(this == obj)
            return true;
        if(obj != null && obj.getClass() == this.getClass()){
            Person pe = (Person)obj;
            if(this.getName().equals(pe.getName()) && this.getGender().equals(pe.getGender()))
                return true;
        }
        return false;
    }

上記の Person クラスのメンバー変数はすべて不変クラス、その中に可変クラスが存在する場合、上記のメソッドを使用して不変クラスを作成すると問題が発生します。パーソンの属性は不変ですが、その属性によって参照されるオブジェクトは変更可能です。

これは、次の例のように、 person の不変性が破壊されます。

最初に変数クラスを作成します College

public class College {
    private String collNo;
    private String collName;
    public College(String collNo, String collName) {
        super();
        this.collNo = collNo;
        this.collName = collName;
    }
    public College() {
        super();
    }
    public String getCollNo() {
        return collNo;
    }
    public void setCollNo(String collNo) {
        this.collNo = collNo;
    }
    public String getCollName() {
        return collName;
    }
    public void setCollName(String collName) {
        this.collName = collName;
    }
    @Override
    public String toString() {
        return "College [collNo=" + collNo + ", collName=" + collName + "]";
    }

参考 College

public class Person {
    private final College college;
    public Person() {
        this.college = null;
    }
    public Person(College college) {
        super();
        this.college = college;
    }
    public College getCollege() {
        return college;
    }
    @Override
    public String toString() {
        return "Person [college=" + college + "]";
    }
    public static void main(String[] args){
        College coll = new College("123456","土木工程");
        Person pe = new Person(coll);
        System.out.println("----->" + pe);
        coll.setCollName("信息工程");                      //这样就会改变Person对象
        System.out.println("======>" + pe);
    }

それでは、変数属性を持つ不変クラスを作成するにはどうすればよいでしょうか?必要なのは、プログラムが College 属性にアクセスできないようにすることだけです。

public class Person {
    private final College college;
    public Person() {
        this.college = null;
    }
    public Person(College college) {
        //创建一个和传入对象有相同属性的College,赋值给成员变量
        this.college = new College(college.getCollNo(),college.getCollName());
    }
    public College getCollege() {
        //创建一个College将属性的值赋值给它并返回
        return new College(this.college.getCollNo(),this.college.getCollNo());
    }
    @Override
    public String toString() {
        return "Person [college=" + college + "]";
    }

上記のアイデアは、外部世界と Person クラスの変数属性の間の接続を分離することです。プログラムは属性に直接作用することはできません。したがって、変数クラス属性が作成されます。

おすすめの関連記事とチュートリアル:

java エントリー プログラム

以上がJavaの不変クラスとその作成ルールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境