2012-01-16 4 views
2

私はJackson JSON parserを使用したいJavaサーブレットを持っています。Java Servletで最終的な静的定数を取得することをお勧めしますか?

複数回インスタンス化するのではなく(サーブレットのさまざまな機能で使用します)、静的な最終として宣言し、同じサーブレットの異なるメソッド間で 'ObjectMapper'を再利用するのは安全ですか?ここで

は、私は現在、それを持っているかの例です:

public class ServiceExample extends HttpServlet { 

    private final static ObjectMapper jsonHelper = new ObjectMapper(); 

    public void doSomething() { 
    jsonHelper.writeValueAsString(new SomeObject()); 
    } 

    public void doSomethingElse() { 
    jsonHelper.writeValueAsString(new SomeOtherObject()); 
    } 
} 

私は、これは大丈夫だったことをどこかで読ん思ったが、私はダブルチェックしたかったです。

編集

According to this, it is thread-safe so long as it's configured before it's used.

感謝。

+2

スレッドセーフである場合のみ。 –

+2

Dave Newtonsのコメントを少し拡大しました。 ObjectMapperクラスがスレッドセーフである場合、サーブレットに最終的な静的ObjectMapperを持たせることは良いことです。 ObjectMapperがスレッドセーフでない場合は、リクエストごとに新しいObjectMapperを作成します。 – DwB

+1

ありがとうございます。投稿を更新しました。「ObjectMapper」は、使用する前に設定されている限り、スレッドセーフです。 – Cuga

答えて

2

それで、クラス内の静的初期化メソッドでそれを設定します。それは問題ではありません。

+0

ありがとうございます。私はそれを設定する必要はありません(私はそれが必要な方法のために動作するデフォルトの設定)が、私は必要があれば、今私はそれをやりたいと思う方法です。 – Cuga

2

サーブレットは、とにかく通常シングルトンなので、あなたのようにそれを構成していた場合、それはどんな違いをすることはないだろう:あなたがウェブで同じサーブレットクラスの複数の<servlet>のエントリを持っている場合は、これにCAVETがある

public class ServiceExample extends HttpServlet { 

    private final ObjectMapper jsonHelper = new ObjectMapper(); 

} 

.xmlは各<servlet>要素のサーブレットの1つのインスタンスになります。

重要なことは、jacksonのObjectMapperがスレッドセーフであるかどうかです。

+0

私は参照してください。だから、 '静的'は普通はシングルトンだから問題ではありませんが、最後はシングルトンです。私は実際にGoogle App Engineを使用しているので、サービスが拡張されるので、それ以上のものがあるかどうかはわかりませんでした。 Jackson javadocsを読むと、 'ObjectMapper'はスレッドセーフです。さらなる洞察をいただきありがとうございます。 – Cuga

+1

最終的に(スレッドの安全性のために)このケースではあまりにも重要ではありませんが、このフィールドはサーブレットの寿命の中で変化しないことをうまく明瞭に示しています。 App Engineでは、各インスタンスは実際は新しいJVM(別のサーバー上)ですので、アプリケーションのまったく新しいインスタンスを取得できます。 –

+0

いいですね。ありがとう! – Cuga

関連する問題