ホームページ  >  記事  >  Java  >  Javaの不変クラスとその作成ルール

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

王林
王林オリジナル
2019-12-03 16:57:443580ブラウズ

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 までご連絡ください。