10
votes

Quel est l'équivalent de clojure d'une "finale statique publique" constante en Java

J'écris du code de clojure qui dépend d'un certain nombre de constantes.

Ils seront utilisés dans des boucles internes serrées, il est donc important qu'ils soient utilisés et optimisés aussi efficacement que possible par la combinaison Compiler + JVM. Je serais normalement utilisé une «finale statique publique» constante en Java dans le même but.

Quel est le meilleur moyen de déclarer ces?


0 commentaires

6 Réponses :


6
votes

Je pense que def des choses dans l'espace de noms global est à peu près aussi proche que possible.


1 commentaires

Ajout de la: Cons-Métadata entraînera l'inlinité au moment de la compilation, voir la réponse par @Amalloy. Les défenseurs globaux sont vars, qui sont closes, peuvent être modifiés et être résolus au moment de l'exécution.



2
votes

Comme indiqué ci-dessus, utilisez DEF ou ATOM, rappelez-vous que les données sont immuables, donc si vous déclarez des constantes dans une liste, elles ne changent pas.


1 commentaires

S'il voulait quelque chose de mutable, il demanderait une constante et de toute façon que vous feriez normalement une liste avec des atomes. Vous feriez une liste d'atomes ou une liste de références.



3
votes

Il n'y a pas de DEFCONST , il suffit d'utiliser un def global def est idiomatique; En ce qui concerne l'optimisation, le JIT fera des choses rapidement.


0 commentaires

3
votes

Si vraiment, vraiment, vraiment envie de la constante en place (je crois, le JIT remarquera que la valeur étant constante et fera la bonne chose, cependant), vous pouvez utiliser une macro.

(do-stuff (my-constant) in-place)


0 commentaires

3
votes

Si juste en utilisant def n'est pas assez rapide, vous pouvez essayer de créer un alias lié avant de saisir votre boucle serrée pour éviter de passer à travers un Var à chaque fois.


1 commentaires

Merci, alors ai-je raison de dire que si vous ne le faites pas, cela finira par la déséroférance de la VAR chaque fois que la constante est accessible?



6
votes

Je crois que Clojure 1.3 (ou peut-être 1.4) vous permet de mettre un ^: constante étiquette sur un def , indiquant au compilateur que cela devrait être une constante et Toutes les références doivent être résolues au moment de la compilation.

Modifier

Apparemment c'est Clojure 1.3, et c'est ^: const , pas ^: constante . Voir Comment clojure ^: const fonctionne? pour un résumé.


0 commentaires