0
package main;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public final class Tutor { 

    private final String name;          
    private final Set<Student> tutees;            

    public Tutor(String name, Student[] students) {           
        this.name = name;    
        this.tutees = new HashSet<Student>();    
        for (int i = 0; i < students.length; i++) {     
            tutees.add(students[i]);                  
        }   
    }     

    public Set<Student> getTutees()  { return Collections.unmodifiableSet(tutees); }   

    public String getName()  { return name; } 

}  

このクラスを不変にするためにできることは他にありますか? 文字列はすでに不変であり、セットは変更不可で返されます。tutees と name 変数はプライベートで最終的なものです。他に何ができるでしょうか?Tutor クラスを使用するクラスだけがパッケージ内にある場合、コンストラクター、getTutees メソッド、および getName メソッドを package-private に変更できますか?

編集:

これが Student クラスです。この質問では、Student を不変にするために必要な変更について説明するよう求められました。変数を final にできるように、両方のセッター メソッドをコメントアウトしました。これが真に不変にする唯一の方法ですか?

public final class Student {   
    private final String name;   
    private final String course;

    public Student(String name, String course) {     
        this.name = name;    
        this.course = course;   
    }     

    public String getName() { return name; }   

    public String getCourse() { return course; }   

    //public void setName(String name) { this.name = name; }   

    //public void setCourse(String course) { this.course = course; }  
}
4

3 に答える 3

3

マイナーな最適化として、tutees不変にすることができるため、内部で変更することさえできませんTutor

public Tutor(String name, Student[] students) {
    this.name = name;
    Set<Student> tuts = new HashSet<>();
    for (Student student : students) {
        tuts.add(student);
    }
    this.tutees = Collections.unmodifiableSet(tuts);
}
public Set<Student> getTutees() { return this.tutees; }

短いバージョン:

public Tutor(String name, Student[] students) {
    this.name = name;
    this.tutees = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(students)));
}
public Set<Student> getTutees() { return this.tutees; }
于 2015-08-20T02:55:12.150 に答える
2

クラスの不変性は、クラスの不変性のみに依存しますStudentStudentが不変の場合は不変でTutorあり、その逆も同様です。Tutorクラスの不変性を保証するために必要なものは他にありません。

視認性について。クラスがパッケージ内でのみ使用される場合、make はパッケージ プライベート (クラス レベル) です。public メソッドを public のままにします。

于 2015-08-20T02:57:20.257 に答える
1

Immutablesは、Java で不変オブジェクトを作成するための便利なツールキットです。それを使用してドメイン全体を構築すると、不変になります。「このオブジェクトは不変か」という問題を方程式から外します。

于 2015-08-20T03:50:06.420 に答える