Como estou trabalhando em um servidor com absolutamente nenhum estado não persistente para os usuários, todos os objetos relacionados ao usuário que temos são lançados a cada solicitação.
Consequentemente, frequentemente me vejo fazendo uma inicialização lenta de propriedades de objetos que podem não ser utilizados.
protected EventDispatcher dispatcher = new EventDispatcher();
Torna-se...
protected EventDispatcher<EventMessage> dispatcher;
public EventDispatcher<EventMessage> getEventDispatcher() {
if (dispatcher == null) {
dispatcher = new EventDispatcher<EventMessage>();
}
return dispatcher;
}
Existe alguma razão para isso não poder ser incorporado ao Java?
protected lazy EventDispatcher dispatcher = new EventDispatcher();
Como mencionado abaixo nos comentários, percebo que uma linguagem poderia evoluir teoricamente para incluir quase tudo o que você deseja. Estou procurando uma medida prática da possibilidade. Isso entraria em conflito com outros recursos? A implementação é simples o suficiente para funcionar bem com a JVM como ela existe? E mesmo, é uma boa ideia?
synchronized
palavra - chave funcionaria da mesma forma que se estivesse no método. Eu imagino que haveria alguma acomodação de métodos de construção mais complicados. No meu caso de uso específico , devido à natureza do problema, com cada solicitação como seu próprio mundo, a sincronização é inútil.Respostas:
Aqui está uma resposta de oito páginas para sua pergunta: http://tinlizzie.org/~awarth/papers/fool07.pdf
Se eu posso tentar resumir grosseiramente os problemas com a adição de preguiça, são os casos de canto. Existem muitas advertências sobre os efeitos colaterais. Considere, no seu exemplo, se o construtor teve efeitos colaterais visíveis, como bater em um contador global ou executar E / S ... É difícil pensar em quando isso aconteceria. Ou considere os efeitos colaterais ainda mais feios sobre as exceções (elas são lançadas ... quando você faz referência ao objeto preguiçoso?)
Basta pular para a seção 6 no documento acima. (E admire toda a lógica formal do sistema de tipos nas páginas que você pula ...)
fonte
Claro que é eminentemente possível. De fato, o scala já possui exatamente esse recurso! (Scala é uma linguagem da JVM e compila até o bytecode). Aqui está um pedaço da fonte scala:
E aqui está a aparência de uma forma intermediária do código compilado:
}
fonte
Eu acho que você primeiro precisa adicionar propriedades reais ao idioma Java, em vez de confiar no idioma getX / setX. Dessa forma, você pode simplesmente marcar a propriedade como preguiçosa (e sincronizada, somente leitura, etc ...).
Classifique o que é solicitado aqui (Objective-C, mas o conceito se aplica).
fonte
Obviamente, isso pode ser adicionado ao Java, a palavra-chave preguiçoso pode ser implementada como açúcar sintático. No entanto, se ele será implementado depende da visão dos construtores do compilador.
fonte