Est-il correct d’utiliser l’instance de Gson en tant que champ statique dans un bean modèle (réutilisation)?

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

public class LoginSession { private static final Gson gson = new Gson(); private Ssortingng id; private Ssortingng name; private long timestamp; public LoginSession(Ssortingng id, Ssortingng name) { this.id = id; this.name = name; this.timestamp = System.currentTimeMillis(); } public Ssortingng toJson() { return gson.toJson(this); } public static LoginSession fromJson(Ssortingng json) { checkArgument(!isNullOrEmpty(json)); return gson.fromJson(json, LoginSession.class); } } 

J’ai pensé qu’il est inutile de créer une nouvelle instance de Gson pour chaque instance de LoginSession.

Mais ce qui m’inquiète, ce sont les problèmes de sécurité des threads. Environ 1000 instances / s seront créées.

Est-il correct d’utiliser l’instance de Gson comme champ statique?

Merci pour tous conseils / corrections.

Cela me semble bien. Il n’y a rien dans l’instance GSON qui le rende lié à une instance spécifique de LoginSession , il devrait donc être statique.

Les instances GSON doivent être sécurisées pour les threads et il existe un bogue concernant ce qui a été corrigé.

La classe Gson principale est Gson les threads. Je viens de rencontrer un problème de sécurité des threads qui était censé être avec GSON. Le problème est survenu lors de l’utilisation d’un JsonDeserializer et d’un JsonDeserializer personnalisés pour l’parsing et le formatage de la date. En fin de compte, le problème de la sécurité des threads était lié à l’utilisation par ma méthode d’une instance SimpleDateFormat statique qui n’est pas adaptée aux threads. Une fois que j’ai enveloppé le SimpleDateFormat statique dans une instance ThreadLocal , tout s’est bien passé.

Selon les commentaires, le test unitaire existant ne teste pas vraiment beaucoup, soyez prudent avec tout ce qui concerne la sécurité des threads …

Un test de l’unité vérifie 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 d’unité est suffisant pour trouver tous les problèmes possibles sur chaque configuration de machine possible? Des commentaires à ce sujet?

Il y a aussi cette phrase dans les docs :

L’instance de Gson ne conserve aucun état lors de l’appel des opérations Json. Ainsi, vous êtes libre de réutiliser le même object pour plusieurs opérations de sérialisation et de désérialisation de Json.