2

Student オブジェクトの状態の正確性について以下のように Immutable クラスを作成する場合、この場合のように getInstance メソッドを呼び出さずに String の場合と同様に新しいオブジェクトを作成する方法はありますか?

 public class Student {

    private final StringBuffer name;
    private final int roll;
    private static Student student;

    private Student(StringBuffer name , int roll)
    {
        this.name = name;
        this.roll = roll;
    }

    public static Student getInstance(StringBuffer name,int roll)
    {
        student = new Student(name, roll);
        return student;
    }

}
4

3 に答える 3

0

「通常の」コードでインスタンスを直接作成することはできませんが、リフレクションを使用して「private」キーワードをバイパスできます。

Constructor<Student> c = Student.class.getDeclaredConstructor(StringBuffer.class, int.class);
c.setAccessible(true); // there goes private!
Student s = c.newInstance(new StringBuffer("Bob"), 6);
于 2013-07-09T04:49:31.023 に答える
0

はい、クラスの getInstance メソッドを呼び出さずに新しいインスタンスを作成する方法があります。その方法は、 Student クラスのインスタンスで clone を呼び出すことです。したがって、クローンメソッドをオーバーライドし、必要に応じて停止してください。

于 2013-07-09T04:40:51.430 に答える
0

不変オブジェクトとは、構築後に状態を変更できないオブジェクトを意味します。したがって、コードを以下のようなものに変更することができますが、それは依然として不変です (一度構築されたオブジェクトの状態を変更する方法がないため、セッターはありません) 同時に、制限なしで自由に構築できます。 :

また、getter メソッドがなかったため、コード状態にアクセスできませんでした。以下に示すように追加する必要があります。

public class Student {

    private int roll;
    private String name;

    private Student(String name , int roll)
    {
        this.name = name;
        this.roll = roll;
    }

    public String getName() {
        return name;
    }

    public int getRoll() {
        return roll;
    }

}

equals() および hashCode() メソッドを実装する必要があります (または、Eclipse -> Source -> Generated hashCode() and equals()...

于 2013-07-09T04:42:12.943 に答える