2

如果我们创建一个 Immutable 类,如下所示以确保 Student 对象的状态的正确性,那么有没有办法像我们为 String 一样创建一个新对象,而无需像这种情况下调用 getInstance 方法?

 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

是的,仍然有一种方法可以在不调用类的 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 回答
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 回答