我有时需要创建一些类,这些类在应用程序的生命周期中只能被实例化一次。将它们设置为单例会导致单元测试变得困难。
但是,因为在应用程序的生命周期中应该只有一个这样的对象实例存在,所以当应用程序运行时两次实例化此类对象将是一个错误。
因此,我希望我的应用程序在检测到此类对象在其生命周期内被实例化两次时立即抛出异常,同时允许在单元测试期间多次实例化此类对象。
我认为这不是一个不合理的要求:如果在应用程序的一个生命周期中只应该创建一个这样的对象,那么抛出异常似乎是正确的做法。
以下是我的做法:
但是,因为在应用程序的生命周期中应该只有一个这样的对象实例存在,所以当应用程序运行时两次实例化此类对象将是一个错误。
因此,我希望我的应用程序在检测到此类对象在其生命周期内被实例化两次时立即抛出异常,同时允许在单元测试期间多次实例化此类对象。
我认为这不是一个不合理的要求:如果在应用程序的一个生命周期中只应该创建一个这样的对象,那么抛出异常似乎是正确的做法。
以下是我的做法:
/**
* The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
* "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
* document are to be interpreted as described in RFC 2119.
*
* You MUST NOT instantiate this class more than once during the application's
* lifecycle. If you try to do so, an exception SHALL be thrown.
*
* You SHOULD be able to instantiate this class more than once when unit
* testing.
*
*
*/
public class LifeCycle {
private static final AtomicInteger cnt = new AtomicInteger( 0 );
@NotNull
public static LifeCycle getNewLifeCycle() {
if ( cnt.incrementAndGet() > 1 && App.isRealApp() ) {
throw new IllegalStateException("Class is already instantiated");
}
return new LifeCycle();
}
}
当我进行单元测试时,App.isRealApp() 应始终返回 false,而在真正的应用程序运行时始终返回 true。
我的问题很简单:这是否有意义,我该如何实现?