Comme je travaille sur un serveur sans aucun état non persistant pour les utilisateurs, chaque objet lié à l'utilisateur que nous avons est déployé à chaque demande.
Par conséquent, je me retrouve souvent à faire une initialisation paresseuse de propriétés d'objets qui peuvent rester inutilisés.
protected EventDispatcher dispatcher = new EventDispatcher();
Devient...
protected EventDispatcher<EventMessage> dispatcher;
public EventDispatcher<EventMessage> getEventDispatcher() {
if (dispatcher == null) {
dispatcher = new EventDispatcher<EventMessage>();
}
return dispatcher;
}
Y a-t-il une raison pour laquelle cela n'a pas pu être intégré à Java?
protected lazy EventDispatcher dispatcher = new EventDispatcher();
Comme mentionné ci-dessous dans les commentaires, je me rends compte qu'un langage pourrait théoriquement évoluer pour inclure presque tout ce que vous voulez. Je cherche une mesure pratique de possibilité. Serait-ce en conflit avec d'autres fonctionnalités? L'implémentation est-elle assez simple pour bien fonctionner avec la JVM telle qu'elle existe? Et même, est-ce une bonne idée?
synchronized
mot - clé fonctionnerait de la même manière que s'il figurait sur la méthode. J'imagine qu'il y aurait une certaine adaptation à des méthodes de construction plus compliquées. Dans mon cas d'utilisation spécifique , en raison de la nature du problème, avec chaque demande comme son propre monde, la synchronisation est inutile.Réponses:
Voici une réponse de huit pages à votre question: http://tinlizzie.org/~awarth/papers/fool07.pdf
Si je peux essayer de résumer grossièrement les problèmes d'ajout de paresse, ce sont les cas d'angle. Il y a beaucoup de mises en garde concernant les effets secondaires. Considérez, dans votre exemple, si le constructeur a eu des effets secondaires visibles, comme heurter un compteur global ou faire des E / S ... Il est difficile de savoir quand cela se produira. Ou considérez des effets secondaires encore plus moches sur les exceptions (ils sont levés ... lorsque vous faites référence à l'objet paresseux?)
Passez simplement à la section 6 du document ci-dessus. (Et admirez toute la logique formelle du système de type sur les pages que vous sautez ...)
la source
Bien sûr, c'est éminemment possible. En fait, scala a déjà exactement cette fonctionnalité! (Scala est un langage JVM et se compile en bytecode). Voici un morceau de source scala:
Et voici à quoi ressemble une forme intermédiaire du code compilé:
}
la source
Je pense que vous devez d'abord ajouter des propriétés réelles à la jauge Java, plutôt que de vous fier à l'idiome getX / setX. De cette façon, vous pouvez simplement marquer la propriété comme paresseuse (et synchronisée, en lecture seule, etc.).
Sorte de ce qui est demandé ici (Objectif-C, mais le concept s'applique).
la source
Bien sûr, cela pourrait être ajouté à Java, le mot-clé paresseux pourrait être implémenté comme sucre syntaxique. Cependant, sa mise en œuvre dépendra de la vision des constructeurs du compilateur.
la source