как проверить, что одноэлементный класс создает только один объект

#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 дает другой ответ.