3

スレッド セーフとして文書化されているクラスを見るたびに、なぜそれが java.lang.Math などのすべての静的メソッドを持つユーティリティ クラスとして設計されていないのか疑問に思います。

単一のクラスで状態がなく、チェーンされたメソッドのようなシナリオでクラスを設計するときはいつでも、有効な推進力がありません。

例 1 : 「スレッドセーフ フィールド」 S を持つクラス A はどうですか。つまり、オブジェクト「S」自体はスレッドセーフです。クラス A の S のようなすべてのメソッドとフィールドを静的であると宣言できますか。

私の説明が十分に明確であることを願っています。どうか明らかにしてください。

注: javabeans、プロパティ保持クラスなどを除外します。私の質問は、入力パラメーターに基づいていくつかのアクションを実行するクラスに関するものでした。他のクラスも使用する必要があるかもしれません。

質問を編集したことをお詫びします。最初のドラフトは完全にあいまいでした。

4

2 に答える 2

3

クラスが状態を持つ必要がある状況を簡単に想像できますが、それはスレッドセーフであることも必要です。たとえば、ワーカースレッドにキューを使用します。スレッドセーフである必要があり、間違いなく状態が含まれている必要があります。(つまり、キュー内の要素)

編集:

注:javabeans、プロパティ保持クラスなどを除外します。私の質問は、入力パラメーターに基づいていくつかのアクションを実行するクラスに関するものでした。他のクラスも使用する必要があるかもしれません。

それによって、あなたの質問が真にステートレスなクラスに関するものであることを意味する場合、-定義により-あなたの観察は正しいです。これらはほとんどの場合、静的ユーティリティ クラスで表現できます。

EDIT2:

多くの場合、staticスレッドセーフについてリラックスできることがわかります。(すべての場合に当てはまるわけではありませんが、経験則にすぎません) スレッドセーフとステートレスはある意味で密接に関係していますが、静的は直交する概念です。さらに、ステートレスはスレッド セーフを提供しますが、スレッド セーフはステートレスを意味する必要はありません。もしそうなら、の概念全体synchronizedが不要になります。

于 2012-06-28T21:24:46.207 に答える
0

テスト容易性のために、static拳が鼻に合うように OO に適合するため。

テスト可能なコードでは、テスト対象のオブジェクトを制御された方法で作成できる必要があります。テストしているオブジェクト内のどこかから呼び出されたという理由だけで、誰かのコードを実行する必要はありません。オブジェクトを単独でテストしたい - 共同作業者が正常に動作していると仮定します。一部のツールの静的メソッドを使用すると、PowerMock を使用してテストを容易にするか、分離に別れを告げて、テスト中にそのコードも実行できます。Powermock は (独自のクラスローダーを使用するため) 問題であり、必要以上のテストを行っています。

静的とは、手続き型コードを意味します。手続き型は時々うまくいくので、それは時々うまくいきます。ただし、オブジェクト指向機能 (継承、ポリモーフィズム) を静的メソッドで使用して、使用しない別の理由を見つけるようにしてstaticください。これを説明する簡単な例: http://www.javaworld.com/javaworld/javaqa/2001-05/01-qa-0504-oo.html?page=1 - 決して網羅的ではありませんが、私が望むポイントを示しています。他の例は、上記の回答に対する @JB Nizet のコメントに記載されています。

私はこれが遅い答えであることを知っていますが、正直なところ、「インスタンスレス」クラスの静的メソッドと、PowerMock とも呼ばれる通常求められているソリューションを使用してオブジェクトをテストする際に、かなりの問題がありました。

于 2013-12-03T16:49:44.257 に答える