web-dev-qa-db-ja.com

Java EE Webアプリケーションでの静的メソッドの多用?

一般に、これが標準であるかどうかを尋ねています。アプリケーションアーキテクチャには、Springとzkフレームワークが含まれています。個人的には仕方ありませんが、これは多くの問題を引き起こすと思います。つまり、これは非同期機能の多くです。それに加えて、私がソースを閲覧したところ、スレッドセーフではないメソッドを持つシングルトンを使用しているように見えるApacheプロジェクトを使用しています。新しいバージョンで変更されましたが、現時点ではライブラリを自由に移行できません。

私の本当の質問は、JavaEEアプリケーションで大量の静的メソッドを使用する正当な理由があるのですか?私はこれ以前はASP.NET開発者でしたが、これに遭遇したことはありません。本能はこれが悪いアーキテクチャであることを指示しますが、私はスタックに慣れていません。従来の一般的な慣習の使用の欠如など、他の警告の兆候があります。これは標準ですか?

あるプラットフォームで異質なものは、別のプラットフォームにはない場合があります。

5
Rig

分析を読むだけで、静的メソッドシングルトンがたくさんあると言っているでしょう。静的メソッド自体は問題ではありませんが、それらがシングルトンオブジェクトへのプロキシ呼び出しに使用されている場合は、それらを堅実にするか、より健全なオブジェクトモデルに置き換えることに取り組みます。

静的メソッドは純粋に機能的な目的に役立ちます。ScalaとClojureプログラミング言語の両方でそれらを多く使用することがわかります。これは主に、変更可能な状態を気にする必要がないためです。

Java静的/クラスメソッド (私は関連するビットを強調表示しました)に関するこのブログ投稿からの読み取り:

静的メソッドは、それらが定義されているクラスのオブジェクトのインスタンス変数を使用しません。メソッドを静的に定義した場合、インスタンス変数にアクセスしようとすると、コンパイラーにより失礼なメッセージが表示されます。 静的変数にアクセスできますが、定数を除いて、これは異常です。静的メソッドは通常、パラメーターからデータをすべて取得し、変数を参照せずにそれらのパラメーターから何かを計算します。これは、ある種の一般的な計算を行う典型的な方法です。これの良い例は、事前定義されたMathクラスの多くのユーティリティメソッドです。 (MathおよびJava.util.Randomを参照してください)。

7
Nick Klauer

Java、C#、またはほとんどすべてのOO言語では、宇宙の状態(通常は静的変数の使用によって示される)を仮定する多くの静的メソッドがある)は慣用的ではありません。静的なUser.getUser()メソッドが次の理由により、任意の瞬間に1人のユーザーのみがインスタンス化できるようにするものを含む、静的変数をあらゆる場所に導入する1つ以上の大規模アプリケーションと1つの統合テストプロジェクトのもつれを解くという苦痛を経験しました。ユーザークラスのアクティブなインスタンスを取得する唯一の方法です。

しかし、それは悪いコードでした。 C#、Perl、およびC++で、このような不正なコードを見たことがあります。それはある種の手続き型プログラマーが親しみを感じるために到達する松葉杖です。グローバルな状態は、十分なコードが生成されて、生成されない限り、理解するのは簡単です。

グローバルな状態が意味をなすものはいくつかありますが、慣用的なJavaアプリケーションでは、これらはログフレームワークだけに限定する必要があります(LogManagerのようなものを呼び出すことができるようにするため)。 getLogger( "somename")、依存関係注入フレームワークで必要となる可能性のあるグローバル依存関係バインディングマップ、オブジェクトリレーショナルマッパーのセッションファクトリなど、構築にかなりのコストがかかるもの。

Springを賢く使用している場合、依存関係のルックアップは通常、アプリケーションの狭い部分に限定されます。 Springが本質的に各クラスコンストラクターに依存関係を要求するService Locatorパターンを実装するためにSpringを使用するのを見てきましたが、これは後で痛みを求めているだけであり、通常、ユニットテストは必要ないため、テスト性に不満を感じます。依存性注入フレームワークに依存する。代わりに、Springの使用の軌跡は小さくなければなりません。通常、MVCプロジェクトのコントローラーファクトリに必要な依存関係を構築させます。サービスについては、比較的狭い範囲でフックできる合理的な場所も通常あります。

J2EEが一種のアーキテクチャー宇宙飛行士バージョンのオブジェクト純度であることを考えると、J2EEアプリで多くの静的(グローバル)状態を見ると、ほぼmore驚きます。ただし、慎重にルーズカップリングを行う方法をよく知らないジュニアエンジニアの多くと、問題を解決するための手続き的な方法で定着したシニアエンジニアが大規模なプロジェクトで投げられることが多いため、スパゲッティを見てもそれほど驚くことではありません。そして、ミートボールは、間違った人々の正しい組み合わせがプロジェクトに置かれたときに、よく理解されていない問題領域にアプローチします。

4
JasonTrue

スタティックは、オブジェクトごとに異なる動作をさせたくない場合に使用する必要があります。

静的データは、データがインスタンスに依存せず、静的メンバーの既存のすべてのインスタンスに同じ状態を適用する場合に使用する必要があります。

静的は、JVM内の他のクラスやクラスローダーへの依存関係や参照を作成し、メモリに長時間留まるため、実際には必要ない場合は、使用しないでください。そのため、現在の作業が完了すると、ガベージコレクションの対象とは見なされなくなります。代わりに、静的クラスへの参照を維持するため、読み込みクラスで逆参照されます。詳細 http://efectivejava.blogspot.in/2013/08/when-to-use-static-members-in-Java.html

0
user98757