2013-07-09 7 views
2

Если мы создадим класс Immutable, как показано ниже для правильности состояния объекта Student, то есть ли способ создать новый Object так же, как мы делаем для String, без вызова метода getInstance, как в этом дело?Regd: неизменяемые объекты для многопотокового приложения

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; 
    } 

} 
+0

Что случилось с вызовом' getInstance' или просто выставляя конструктор – SimonC

+0

@AshishAggarwal, возвращаемый 'Student' еще неизменен Кроме того, это не синглтон как новый объект создан. каждый вызов 'ge tInstance'. Однако существует условие гонки, если 'getInstance' вызывается одновременно, поскольку один поток может получить экземпляр, созданный другим потоком (с потенциально разными' name' и 'roll'). – SimonC

+0

Согласовано. Спасибо. Каждый раз для этого объекта Студент вызывает конструктор для обновления ссылочной переменной новым объектом. – Ullas

ответ

0

Да еще есть способ создать новый экземпляр без вызова метода getInstance вашего класса. Таким образом, нужно вызвать clone на экземпляр класса Student. Поэтому переопределите метод клонирования и остановите это, если вам нужно.

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() и хэш-код() метод (или удобно генерировать с помощью Eclipse -> Source -> Generated hashCode() and equals()...

0

Вы не можете создать экземпляр непосредственно с «нормальным» кода, но вы можете обойти «частный "ключевое слово с помощью отражения:

Constructor<Student> c = Student.class.getDeclaredConstructor(StringBuffer.class, int.class); 
c.setAccessible(true); // there goes private! 
Student s = c.newInstance(new StringBuffer("Bob"), 6); 
Смежные вопросы