Java implémente-t-il un modèle de conception Flyweight avec des chaînes? [dupliquer]


Cette question a déjà une réponse ici:

Selon la définition GOF pour "Flyweight", réutiliser\partager le même type d'objets pour réduire la croissance de la mémoire.

Si c'est le cas, java string object fait de même en utilisant string constant pool. Alors pouvons nous dire cette chaîne Java implémente le modèle de conception Flyweight? Si non, pourquoi?

Author: Mureinik, 2016-05-22

2 answers

Peut-on dire que Java String implémente le modèle de conception Flyweight?

Pas vraiment. Ou au mieux, vous pouvez dire qu'ilpeut implémenter ce modèle.

Le pool de constantes de chaîne ne contient que String objets qui correspondent à:

  • Chaîne Java > > littéraux
  • autres constantes de chaîne de compilation, et
  • Objets String qui ont été délibérément "internés" par un appel de méthode d'application ou de bibliothèque la méthode String.intern().

Les objets Java normaux String ne sont pas créés dans le pool de chaînes. Au lieu de cela, ils sont créés dans le tas normal, et seulement "mis dans le pool" par un appel à intern(). C'est pour une bonne raison. Si toutes les chaînes étaient internées par défaut, cela augmenterait les frais généraux du GC et/ou l'empreinte mémoire à long terme d'une application Java typique.

(Notez que Java 8 a maintenant une fonction de déduplication de chaîne facultative dans le collecteur G1 qui économise de l'espace en combinaison des tableaux de caractères de chaînes égales.)

 5
Author: Stephen C, 2016-05-22 22:53:04

Oui, le pool de chaînes de Java est un bon exemple du modèle flyweight. Comme indiqué par l'article wikipedia sur le sujet:

Un autre exemple [de ce modèle] est le stage de chaîne.

 2
Author: Mureinik, 2016-05-22 06:41:04