2012-02-18 2 views
2

Нужно ли Assert.notNull Singleton Object?Утверждение не null объекта 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 

Здесь Утверждают класс org.springframework.util.Assert.

Если сообщение Assertion failed is anyway вызывает System.exit (0) после сбоя?

+3

* (не ответ на ваш вопрос, следовательно, комментарий) * ... ** Если ** вы действительно хотите использовать синглтон, то вы можете полностью уклониться от стоимости синхронизации. Например, используя * "Инициал класса владельца инициализации по требованию" *, описанный в * Эффективном Java *. – TacticalCoder

+1

На самом деле вам никогда не нужно утверждение. – rotsch

ответ

4

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

+0

Спасибо @bunting –

2

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

+0

Спасибо @ruakh ... –

2

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

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

+0

Спасибо @Churk ... –

+0

Как он заявил в вопросе, он использует 'Assert' Spring, а не JUnit's. – Paul

2

Я рекомендую использовать initialization-on-demand pattern (т. Е. Ленивый загрузочный синглтон) для вашего синглтона. В этом шаблоне, если построение экземпляра не выполняется, вы получите исключение, иначе вы получите объект.

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

Использование инициализации по требованию ваш код будет:

public class ComponentFactory 
{ 
    private ComponentFactory() 
    { 
    } 

    private static class LazyHolder 
    { 
    public static final LibraryFrame INSTANCE = new LibraryFrame(); 
    } 

    public static LibraryFrame getLibraryFrame() 
    { 
    return LazyHolder.INSTANCE; 
    } 
} 

Чтобы использовать все равно будет:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame(); 

... кроме вас больше не нужно ни Assert, ни Synchronized ,

+0

Спасибо @Paul ... –

Смежные вопросы