Поскольку я работаю на сервере с абсолютно отсутствующим непостоянным состоянием для пользователей, каждый объект, связанный с пользователем, развертывается при каждом запросе.
Следовательно, я часто выполняю ленивую инициализацию свойств объектов, которые могут остаться неиспользованными.
protected EventDispatcher dispatcher = new EventDispatcher();
Становится ...
protected EventDispatcher<EventMessage> dispatcher;
public EventDispatcher<EventMessage> getEventDispatcher() {
if (dispatcher == null) {
dispatcher = new EventDispatcher<EventMessage>();
}
return dispatcher;
}
Есть ли какая-то причина, по которой это не может быть встроено в Java?
protected lazy EventDispatcher dispatcher = new EventDispatcher();
Как упомянуто ниже в комментариях, я понимаю, что язык может теоретически развиваться и включать в себя практически все, что вы захотите. Я ищу практическое измерение возможности. Будет ли это противоречить другим функциям? Является ли реализация достаточно простой, чтобы хорошо работать с JVM, как она существует? И даже, это хорошая идея?
synchronized
ключевое слово будет работать так же, как если бы оно было в методе. Я предполагаю, что было бы какое-то приспособление более сложных методов строительства. В моем конкретном случае использования, из-за характера проблемы, для каждого запроса, как своего собственного мира, синхронизация бессмысленна.Ответы:
Вот восьмистраничный ответ на ваш вопрос: http://tinlizzie.org/~awarth/papers/fool07.pdf
Если я могу попытаться грубо суммировать проблемы с добавлением лени, это угловые случаи. Есть много предостережений по поводу побочных эффектов. Рассмотрим, в вашем примере, если у конструктора были видимые побочные эффекты, такие как столкновение с глобальным счетчиком или ввод-вывод ... Трудно представить, когда это произойдет. Или рассмотрите еще более неприятные побочные эффекты в отношении исключений (они выбрасываются ... когда вы ссылаетесь на ленивый объект?)
Просто перейдите к разделу 6 в приведенном выше документе. (И восхищайтесь всей формальной логикой системы типов на страницах, которые вы пропускаете ...)
источник
Конечно, это в высшей степени возможно. На самом деле, Scala уже имеет именно эту функцию! (Scala является языком JVM и компилируется в байт-код). Вот часть источника scala:
А вот как выглядит промежуточная форма скомпилированного кода:
}
источник
Я думаю, что сначала вам нужно добавить реальные свойства в язык Java, а не полагаться на идиому getX / setX. Таким образом, вы можете просто пометить свойство как ленивое (и синхронизированное, только для чтения и т. Д.).
Сортировка чего просят здесь (Objective-C, но понятие относится).
источник
Конечно, это может быть добавлено в Java, ключевое слово lazy может быть реализовано как синтаксический сахар. Однако, будет ли это реализовано, зависит от видения разработчиков компиляторов.
источник