Не утверждать, что NULL объекта Singleton - PullRequest
2 голосов
/ 18 февраля 2012

Требуется ли Assert.notNull объекта Singleton?

У меня есть класс:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

    public static synchronized LibraryFrame getLibraryFrame() {
        if (libraryFrame == null) {
           libraryFrame = new LibraryFrame();
        }
        return libraryFrame;
    }
}

Теперь нужно использовать как:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
Assert.notNull(libraryFrame);
// other part

Здесь класс Assert - org.springframework.util.Assert.

Если утверждение не выполнено, есть ли способ вызвать System.exit (0) после возникновения ошибки?

Ответы [ 4 ]

4 голосов
/ 18 февраля 2012

Утверждение не требуется, поскольку экземпляр LibraryFrame всегда будет инициализирован в этой точке.

2 голосов
/ 18 февраля 2012

Я рекомендую использовать шаблон инициализации по требованию (т.е. синглтон с отложенной загрузкой) для вашего синглтона.В этом шаблоне, если построение экземпляра завершится неудачно, вы получите исключение, в противном случае вы получите объект.

Это улучшает ваше решение двумя способами: оно не требует дополнительных затрат на синхронизацию иэто не накладные расходы Assert.Оба метода выдают исключение, если объект-одиночка не создан - в вашем коде вы получите IllegalArgumentException из assert.

Используя init-on-demand ваш код будет:*

Для его использования все равно будет:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();

... за исключением того, что вам больше не нужны ни Assert, ни Synchronized.

2 голосов
/ 18 февраля 2012

Хорошо, когда вы используете класс Assert из JUnit, все методы в нем являются пустыми, но он использует инфраструктуру JUnit, чтобы сообщить вам, прошел тест или нет.

Если это метод для модульного тестирования, значит, вы выполнили тест, но если это был метод для выполнения, используйте условие if.

2 голосов
/ 18 февраля 2012

Согласно документации для этого класса , он действительно предназначен для использования методом для проверки своих аргументов. (То есть он предназначен для обеспечения выполнения предварительных условий .) У вас должны быть юнит-тесты для ComponentFactory, и они должны утверждать, что его статический метод getLibraryFrame() не возвращает null, но не стоит утверждать это во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...