Method1
Я могу думать о классе слушателя.
Constructor () {
object = null
listener = new Object() { // this is called once
object = init()
listener = new Object() { // next time
do-nothing() // this is called
}
}
Object get() {
listener.invoke()
return object
У него нет средств проверки условий, но он добавляет дополнительное поле к каждому объекту, эффективно дублируя потребление памяти, тогда как глупое наказание за вызов бесполезного кода listener.invoke()
сохраняется.Я не знаю, как удалить его при всем полиморфизме.Поскольку метод get()
является общим для всех экземпляров класса, он не может быть преобразован.
Method2
Инициализация Java по требованию с использованием загрузки ленивых классов.
Нижняя строка
Итак, похожеальтернативы хуже условных, потому что современные процессоры оптимизируют прогнозы ветвлений.Таким образом, штраф за проверку будет очень маленьким, как я ожидаю, после инициализации кода и перехода всегда идти в одном направлении.Ложная ветвь будет принята только один раз, во время инициализации, и она также будет короткой по сравнению с вашим временем инициализации.В противном случае вы можете не захотеть откладывать инициализацию.