161 votes

Peut-on utiliser l'instance Gson comme champ statique dans un bean de modèle (réutilisation)?

Voici le modèle que j'ai implémenté:

 public class LoginSession {
    private static final Gson gson = new Gson();

    private String id;
    private String name;
    private long timestamp;

    public LoginSession(String id, String name) {
        this.id = id;
        this.name = name;
        this.timestamp = System.currentTimeMillis();
    }

    public String toJson() {
        return gson.toJson(this);
    }

    public static LoginSession fromJson(String json) {
        checkArgument(!isNullOrEmpty(json));
        return gson.fromJson(json, LoginSession.class);
    }
}
 

Je pensais qu'il était inutile de créer une nouvelle instance Gson pour chaque instance LoginSession.

Mais ce qui me préoccupe, ce sont les problèmes de sécurité des threads. Environ 1000 instances / s seront créées.

Est-il possible d'utiliser l'instance Gson en tant que champ statique?

Merci pour tous conseils / corrections.

148voto

MByD Points 78505

Cela me semble parfait. Il n'y a rien dans l'instance GSON qui la rend liée à une instance spécifique de LoginSession , elle devrait donc être statique.

Les instances GSON devraient être sécurisées pour les threads , et il y avait un bogue concernant ce qui était corrigé.

8voto

Christophe Roussy Points 2347

Les versions les plus récentes sont probablement. Il y a une unité de test de vérification pour la sécurité des threads:

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

Vous pouvez vous demander si ce test est suffisante pour trouver chaque problème possible sur tous les possibles de la configuration de la machine ? Des commentaires sur cette question ?

Il y a aussi cette phrase dans les docs:

Le Gson instance n'a pas d'état, tout en invoquant Json les opérations. Donc, vous êtes libre de réutiliser le même objet pour plusieurs Json de la sérialisation et la désérialisation des opérations.

0voto

bmartins Points 982

Dans le cas où votre dans un enfilage de l'environnement, je dirais qu'il serait mieux de le sortir des modèles.

Envelopper l'accès à la GSON instance dans un délai de serrures( dans le cas de Java, l'utilisation de la synchronisation ).

Je voudrais également ajouter que, même si il a l'air bien, je m'interroge sur le but d'avoir le champ statique à l'intérieur de la Modèles de la classe. Personnellement, je ne voudrais pas avoir l'intérieur à cause de la séparation des préoccupations. Ce n'est pas les Modèles de la responsabilité de gérer cela.

Mais à partir de la perspective de mise en œuvre, semble Ok.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X