是否需要单个对象的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)?
答案 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();
...除了您不再需要Assert
和Synchronized
。