#java #singleton
#java #одноэлементный
Вопрос:
Я хочу протестировать, что одноэлементный класс создает только один объект. Как протестировать класс.
Вот код
Одноэлементный класс:-
public class SpringApplicationContext {
private static ClassPathXmlApplicationContext context = null;
private SpringApplicationContext(){};
public static ClassPathXmlApplicationContext getInstance() {
if (context == null) {
context = new ClassPathXmlApplicationContext(
"spring.xml");
}
return context;
}
}
Вызывающий класс:-
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = SpringApplicationContext.getInstance();
System.out.println("yup");
}
Комментарии:
1. Вызовите
getInstance
несколько раз и проверьте, возвращает ли==
on ссылки true. Для составных объектов вам нужно будет проверять каждый ссылочный тип внутри вашего одноэлементного.2. Обратите внимание, что ваша реализация не является потокобезопасной. То есть два потока могут привести к созданию двух экземпляров.
3. @TheLostMind — когда он вернет true. Он возвращает true только при сравнении двух ссылок.
4. @RaviKumarRavanam — он вернет true, если объект, на который указывают 2 ссылки, совпадает
Ответ №1:
Вы можете проверить с помощью sysout toString для объекта, он печатает ссылку на объект, поэтому вывод этого должен быть одинаковым для всех разных объектов.
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx1 = SpringApplicationContext.getInstance();
ClassPathXmlApplicationContext ctx2 = SpringApplicationContext.getInstance();
System.out.println("yup");
if(System.identityHashCode(ctx1) == System.identityHashCode(ctx2)){
System.out.println("Hash code is same");
}
}
Комментарии:
1. @RaviKumarRavanam — Если вы действительно хотите использовать этот метод, то проверьте
IdentityHashCode
равенство.2. Этот ответ неверен. Что делать, если класс переопределяется
toString()
?3. @RaviKumarRavanam — Проверка
System.identityHashCode(ctx) == System.identityHashCode(ctx1)
4. @ TheLostMind — Не могли бы вы предоставить пример кода с приведенным выше кодом, где переопределение метода toString дает другой ответ.