10
votes

Java optimise-t-il des objets immuables?

Les chaînes Java sont immuables et instantiant plusieurs chaînes avec les mêmes valeurs renvoie le même pointeur d'objet. (Y a-t-il un terme pour cela? "La mise en commun" semble s'adapter, mais cela fait déjà référence à la mise en cache pour gagner du temps en faisant moins d'instanciations.)

Java fait-il aussi cela (la chose sans terme) avec d'autres classes (définies par l'utilisateur) qui sont immuables? Java peut-elle même détecter qu'une classe est immuable ou est-ce quelque chose d'unique à la classe de cordes?


6 commentaires

+1 question intéressante. Je crois que Java peut reconnaître les classes ayant seulement des membres finaux et les traiter comme immuables, mais je n'ai aucune information précise à ce sujet. Je vais mettre un oeil sur cette question. Merci


Ce n'est pas le cas et considère ce qui se passerait si vous avez changé d'objet immuable de toute façon, avec réflexion ..


Je vois, je suis un peu surpris de ça. Merci


"Y a-t-il un terme pour cela?" Java appelle-le " Interning "la chaîne .


nouvelle chaîne ("bla")! = nouvelle chaîne ("bla") Votre phrase initiale n'est donc pas assez précise.


@HAROLD Hotspot optimisons sur final des champs, quel que soit le fait qu'ils peuvent être mutés à l'aide de la réflexion. Ils considèrent que ce qui se passerait et décida de le faire quand même :)


5 Réponses :


7
votes

wrt. Strings, le mot que vous recherchez est interne .

Java ne fera pas cela pour vos propres objets immuables. Cela a cependant des versions en cache des primitives boxées. Voir cet article sur Caching de classe wrapper pour plus d'informations.


0 commentaires

0
votes

chaîne interne . Wikipedia: String Interning


0 commentaires

0
votes

String String Interning est unique à la classe de cordes seulement. Je suppose que JVM n'applique pas ces règles pour une classe définie par l'utilisateur.


0 commentaires

1
votes

Le terme que vous êtes surveillez-vous. Java Optimisez les chaînes "automatiquement", pendant la compilation et donnez la possibilité de le développeur de le faire au moment de l'exécution. (Les détails sur ce qui est optimisé en dépend de la version JVM.)

aussi loin qu'il va pour des objets immuables. Je ne pense pas que Java aide tout type de mécanisme qui résoudre le même instaciation. Le type de chaîne n'est pas une exception de cette règle.

Motif Pourquoi, est que vous devez utiliser l'opérateur nouveau pour créer une instance. Si vous utilisez Nouveau pour créer une instance de chaîne, vous obtiendrez toujours deux objets différents.

L'interaction est disponible uniquement pour le type de chaîne. Mais le concept est gratuit, vous pouvez ajouter à votre classe immuable telle méthode et écrire une méthode compliquée qui fera la même chose.


0 commentaires

3
votes

Comme d'autres ici ont dit que ce processus avec des chaînes est appelé interne.

Sa mérite de mentionner que le comportement des chaînes avec les mêmes valeurs littérales étant le même objet peut ou non être vrai dans Java 7. À partir de 7:

dans JDK 7, les chaînes internes ne sont plus allouées dans la génération permanente du tas Java, mais sont plutôt allouées dans la partie principale du tas Java (connu sous le nom de jeunes et de vieilles générations), ainsi que les autres objets créés. par l'application. Ce changement entraînera davantage de données résidant dans le Heap Java principal et moins de données dans la génération permanente, et peut donc nécessiter des tailles de tas à être ajustées. La plupart des applications ne verront que des différences relativement faibles dans l'utilisation du tas en raison de ce changement, mais des applications plus importantes qui chargent de nombreuses classes ou font une utilisation intensive de la méthode String.Intern () verront des différences plus significatives.

Jetez un coup d'œil à Java SE 7 RFE pour les détails complets à ce sujet.

En ce qui concerne vos propres objets immuables, Java ne fait rien de spécial avec eux - cela ne sait pas qu'ils sont immuables. Il peut méthodes en ligne un peu plus que sinon, si cela peut détecter que sa valeur / possible, mais aussi loin que possible au compilateur et à la JVM, ils sont simplement un autre objet.


1 commentaires

Wow, descendue? Je peux prendre un bowvote, mais aurait été agréable de savoir pourquoi