Вопрос

Необходимо ли утверждать. Независимо от объекта 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 Class является org.springframework.util.assert.

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

Это было полезно?

Решение

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

Другие советы

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

Что ж, когда вы используете класс Assert из Junit, любой метод там есть пустоты, но он использует структуру JUNIT, чтобы сказать вам, пройдет ли тест или пройдет.

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

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

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

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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top