2

单例对象是否需要 Assert.notNull?

我有一堂课:

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。

如果 Assertion failed 无论如何在失败发生后调用 System.exit(0) ?

4

4 回答 4

4

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

于 2012-02-18T17:07:30.463 回答
2

根据该类的文档,它实际上是供方法用来验证其参数的。(也就是说,它旨在强制执行先决条件。)您应该对 进行单元测试ComponentFactory,并且他们应该断言其静态getLibraryFrame()方法不会返回null,但在运行时断言这一点是不值得的。

于 2012-02-18T17:10:19.820 回答
2

好吧,当您使用 JUnit 中的 Assert 类时,其中的任何方法都是无效的,但它使用 JUnit 框架来告诉您测试是通过还是失败。

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

于 2012-02-18T17:12:58.287 回答
2

我建议为您的单例使用按需初始化模式(即延迟加载单例)。在该模式中,如果实例的构造失败,您将获得异常,否则您将获得对象。

这从两个方面改进了您的解决方案:它没有同步的开销,也没有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();

...除了您不再需要 theAssertSynchronized.

于 2012-02-18T17:20:51.440 回答