断言不是Singleton对象的null

时间:2012-02-18 17:04:23

标签: java singleton assertion

是否需要单个对象的Assert.notNull?

我有一个班级:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

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

现在需要使用as:

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

这里的Assert类是org.springframework.util.Assert。

如果Assertion失败,无论如何都会在发生故障后调用System.exit(0)?

4 个答案:

答案 0 :(得分:4)

Assert不是必需的,因为LibraryFrame实例此时将始终初始化。

答案 1 :(得分:2)

根据the documentation for that class,它确实打算被一个方法用来验证它的参数。 (也就是说,它用于执行前置条件。)您应该对ComponentFactory进行单元测试,并且应该断言它的静态getLibraryFrame()方法不会返回null,但在运行时声明这一点并不值得。

答案 2 :(得分:2)

当您使用JUnit中的Assert类时,其中的任何方法都是void,但它使用JUnit框架告诉您测试是否通过或失败。

如果这是单元测试的方法,那么你已经完成了测试,但是如果这是运行时的,那么使用if条件。

答案 3 :(得分:2)

我建议您为单身人士使用initialization-on-demand pattern(即延迟加载单身人士)。在该模式中,如果实例的构造失败,您将获得异常,否则您将获得该对象。

这可以通过两种方式改进您的解决方案:它没有同步开销,并且没有Assert的开销。如果未创建单例对象,则两种方法都会抛出异常 - 在代码中,您将从断言中获得IllegalArgumentException

使用init-on-demand,您的代码将是:

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();

...除了您不再需要AssertSynchronized