2010-12-01 5 views
1

プロジェクトで多用されている1つのライブラリでは、そのクラスの変数が決して静的であってはならないという制限があります。 (それはULCです)。私が理解する限り、それらをすべて直列化する必要があるからです。このルールの問題は、それが厳密ではなく、デバッグが非常に難しいバグの原因かもしれないということです。どのタイプの変数が決して静的であってはならないのか?

私たちはCheckstyleがそのような型の静的変数を検出するモジュールを作成します(カスタマイズ可能な正規表現で検出される可能性があります)。そして、他の開発者がこのチェックをどの程度必要としているかを知る必要があります。

したがって、問題は次のとおりです。一部のタイプの変数が決して静的であってはならない一般的な状況は何ですか?

+0

変数を意味しますか? 「静的インスタンス」という概念はありません。 –

+0

はい、訂正していただきありがとうございます。 –

答えて

1

まず、適切なオブジェクト指向設計では、メソッド/フィールドを静的にする決定を通知する必要があります。

第2に、要求がすべて別のスレッドで処理されるWebアプリケーションでは、静的メソッド/フィールドの使用方法に非常に注意する必要があります。静的メソッドが呼び出し間で状態を保持している場合(静的フィールドを使用してカウントを保持するなど)、スレッドの問題に遭遇する可能性があります。これは、1つの要求で静的メソッドが呼び出され、そのメソッドを呼び出す別のスレッドによって実行の途中で停止される可能性があるためです。最初の呼び出しが共通のリソースを変更したが完了しなかった場合、2回目の呼び出しによって最初の実行の進行が壊れる可能性があります。

+0

私は同意しますが、実際には適切なOOA/OODは、決してJavaのidiosynchratic * static *を使用しないことを要求しています。 OOA/OODレベルには存在せず、適切な翻訳の代わりに言語のidiosynchrasiesを使用するのは常にOOA/OOD - > OOP変換エラーです。 Javaの静的性が必要だと思うかもしれませんが、実際にはそうではありません。* OOA/OODは* static *キーワードを使用して** EVER **なしでJavaに変換できます。どんなOOA/OODも*静的な*概念を持たないOO言語に適切かつきれいに翻訳できるように。 – SyntaxT3rr0r

0

単純な答え:型がスレッドセーフな方法で変更される場合、型を静的インスタンスとして使用してはなりません。私はこれがULCが(シリアル化のせいではなく)このような型を使わないことを勧めている理由だと思う。

残念ながら、これをcheckstyleのようなものでチェックするのは非常に難しいです。たとえば、HashMapはスレッドセーフではありません。しかし、私はインスタンスを構築し、クラスの読み込み中に静的にそれを設定し、その後、マップから読み込んだ場合、これはHashMapの安全な使用です(クラスローディングはセットアップ時に外部スレッドセーフティの保証を提供し、 。

+0

私が知る限り、ULC型の静的変数の問題は並行性にありません。しかし、私はcheckstyleまたは同様のツールがまだそのような場合に使用できると思います。静的でないことが禁じられている型の名前が正規表現で指定されている場合、プロジェクトの特定の型を禁止することができます。これは大きな開発チームで役に立ちます。 –

関連する問題