Question

Voici un exemple de méthode statique utilisée dans une application Web. Comme vous pouvez le constater, String [] allergensArr est insantié chaque fois que cette méthode est appelée. C'est threadsafe puisqu'il s'agit d'une méthode statique, mais c'est un appel coûteux.

Quels sont quelques autres moyens d'utiliser l'allergensArr [] pour qu'il ne soit pas instancié chaque fois que la méthode est appelée.

Je réfléchissais aux options suivantes.

  • Avoir un constructeur statique qui initialise une chaîne finale statique []
  • Utilisez un singleton (bien que cela bloque beaucoup de gens)

Ce sera un tableau constant qui ne changera pas pendant la durée de vie d'un serveur instancié.

public class UserHealthConcernsManager {
    public static String[] getAllergensFlag () {

        String[] allergensArr = new String[12];

        allergensArr[0] = "x";
        allergensArr[1] = "y";
        allergensArr[2] = "w";
                 _SNIP_
                return allergensArr;
     }
}
Était-ce utile?

La solution

Avez-vous envisagé d'utiliser List s au lieu de tableaux de références?

Le code pourrait être réduit à:

public static final List<String> allergensFlag =
    Collections.unmodifiableList(Arrays.asList(
        "x",
        "y",
        "w",
        ...
    ));

Si vous voulez vraiment, vraiment vouloir des tableaux à l'ancienne, le coût du clonage est alors minuscule .

private static final String[] allergensFlag = {
    "x",
    "y",
    "w",
    ...
};

public static String[] getAllergensFlag () {
    return allergensFlag.clone();
}

Autres conseils

  1. Statique ne signifie pas threadsafe. Si " utilisateur " (HashMapSupport) est partagé entre plusieurs threads ...
  2. Cela ne semble pas très cher.
  3. Vous pouvez stocker ce type d'informations dans l'objet Session si vous en sentez le besoin.
  4. Si vous devez vous assurer que le tableau de chaînes ne peut pas être modifié, vous devez alors envelopper le tableau de chaînes dans un autre objet pour garantir que l'objet stocké est immuable (par exemple, seules les méthodes getter).

Edit: Yargh. Comme l'ont noté d'autres personnes, vous avez considérablement modifié le problème. Si vous voulez vous assurer que le tableau est immuable, voir le point 4.

Un constructeur statique semble être la solution évidente.

static String[] allergensArr = {"x", "y", "w", ...9 more...}

Vous devez vous assurer que personne ne réaffecte le champ statique ni ne modifie le tableau pendant la durée de vie de votre application.

Mise à jour: si vous voulez vraiment vous assurer qu'aucun client ne l'altère, vous pouvez le faire:

final static List<String> x = Collections.unmodifiableList(Arrays.asList("x", "y", "z", ...));

Parfois, la portée du problème définie peut être trop étroite pour permettre une bonne optimisation.

Si votre problème est que vous DEVEZ déplacer ces éléments de la mappe de hachage transmise vers un tableau, cela ne va pas devenir beaucoup plus efficace (bien que vous souhaitiez probablement commencer par un tableau comme celui-ci: new String [] {"ADDED_SUGARS_FREE_FLAG", "EGG_FREE_FLAG", ...} et parcourez-le de sorte que toutes les lignes dupliquées ne soient pas dupliquées.

Donc, pour obtenir une meilleure optimisation, vous devrez peut-être effectuer un zoom arrière d’un ou deux niveaux. Pourquoi les stockez-vous dans un tableau, ne pourriez-vous pas simplement copier le hashmap de l'utilisateur en partie ou en totalité? Le hashmap de l'utilisateur peut-il être rendu immuable afin que vous puissiez simplement en faire une copie avec un pointeur et ne même pas vous soucier d'extraire de la valeur?

Ou, mieux encore, pouvez-vous emballer HashMapSupport avec une collection plus intelligente qui résout les problèmes de toutes les classes qui l'utilisent.

Je ne peux pas vraiment répondre à ces questions sans en savoir beaucoup plus sur votre code, mais c'est le genre de choses que je regarderais.

Après votre modification: Vous avez déjà un peu changé le problème. Ce que vous avez maintenant équivaut à:

return new String[]{"w", "x", "y", ...}

Êtes-vous sûr de ne pas avoir simplifié une partie du problème?

Initialisez simplement le tableau au démarrage de l'application Web et mettez le contexte du servlet. Voir ServletContextListener et ServletContext .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top