471 votes

Dois-je faire ObjectMapper de Jackson en tant que finale statique

ObjectMapper dans Jackson semble être thread-safe. http://wiki.fasterxml.com/JacksonFAQThreadSafety

Est-ce que ça veut dire que je peux déclarer

 class Me {
    private static final ObjectMapper mapper = new ObjectMapper();
}
 

au lieu de

 class Me {
    private final ObjectMapper mapper = new ObjectMapper();
}
 

Merci.

629voto

StaxMan Points 34626

Oui, c'est sûr et recommandé.

Le seul inconvénient de la page que vous avez mentionné est que vous ne pouvez pas modifier la configuration du mappeur une fois qu'il est partagé; mais vous n'êtes pas changer la configuration de sorte que c'est très bien. Si vous avez besoin de changer de configuration, vous pouvez faire cela à partir de la statique bloc et il serait bien ainsi.

EDIT: (2013/10)

Avec la 2.0 et au-dessus, ci-dessus peuvent être complétées par notant qu'il est encore mieux: ise ObjectWriter et ObjectReader objets, qui peuvent être construits en ObjectMapper. Ils sont entièrement immuable, thread-safe, ce qui signifie qu'il n'est même pas possible, en théorie, à cause de thread questions de sécurité (qui peuvent se produire avec l' ObjectMapper le forum code tente de re-configurer exemple).

2voto

JBCP Points 2397

Bien qu'il est sécuritaire de le déclarer statique ObjectMapper en termes de sécurité des threads, vous devez être conscient que la construction d'un Objet statique des variables en Java est considéré comme une mauvaise pratique. Pour plus de détails, voir Pourquoi sont variables statiques considéré comme mauvais? (et si vous le souhaitez, ma réponse)

En bref, la statique doit être évitée parce que la rendre plus difficile l'écriture concise des tests unitaires. Par exemple, avec un static final ObjectMapper, vous ne pouvez pas changer la sérialisation JSON pour code factice ou un no-op.

En outre, un static final vous empêche de jamais la reconfiguration ObjectMapper au moment de l'exécution. Vous ne pourriez pas imaginer une raison pour que maintenant, mais si vous vous enfermez dans une statique motif final, rien de démolir le chargeur de classe vous permettra de ré-initialiser.

Dans le cas de ObjectMapper son probablement très bien, mais en général, c'est une mauvaise pratique et il n'y a aucun avantage par rapport à l'aide d'un singleton ou une inversion de contrôle pour gérer votre longue durée de vie des objets.

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