Иногда мне нужны классы, которые должны создаваться только один раз в течение жизненного цикла приложения.Делать их одиночными нехорошо, потому что тогда модульное тестирование становится проблематичным.
Но все же, поскольку в течение жизненного цикла моего приложения должен существовать один-единственный экземпляр таких объектов, было бы ошибкой когда-либо создавать такой объектдважды когда приложение работает .
Поэтому я бы хотел, чтобы мое приложение выдало исключение, как только оно обнаружит, в течение своего жизненного цикла, что такой объект создается дважды все еще позволяя несколько экземпляров такого объекта во время модульного тестирования .
Я думаю, что это не является необоснованным требованием: если в течение одного жизненного цикла приложения должен быть создан только один такой объект, создание исключения выглядит какправильная вещь.
Вот что я делаю:
/**
* 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 когда работает настоящее приложение.
Мой вопрос прост: делает ли онсмысл и как мне это реализовать?