- ベストアンサー
Java staticな呼び出し?について
Javaについての質問です。 staticについて過去の質問等確認しているのですが、 よくわからない部分がありまして、 メソッドを作成する際に public class TimeUtil{ public static String getTime(int iFormat){ Calendar cal = Calendar.getInstance(); String sFormat = フォーマット取得(iFormat)「yyyyMMddHHmmssSSS等」 フォーマット定義(cal.getTime(),sFormat) } } 等を作成し、Webアプリケーションで、 TimeUtil.getTime(iFormat); として使用した場合、 複数同時接続があると要求した形式で返らないケースが あるのでしょうか? 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
staticと言っても、static変数とstaticメソッドがあり、それぞれで状況が異なります。 static変数については、No2さんの言うとおり一つしか存在しないので、 同時接続で値が書き換わる恐れがあります。 staticメソッドについては、同時接続で戻り値がおかしくなることはなかったはずです。 ただし、static変数を内部で使ってれば別です。 メソッド内部で使ってるsFormatのような変数(ローカル変数)は、実行のたびにそれぞれ確保されるので、 別の呼び出しによって値が書き換えられることはないです。 なので、今回のコードに限って言えば大丈夫そうです。 ※以下、個人的な意見です。反対の意見もあるかもしれません。あくまで参考までに。 >この「static」は多用していいものなのでしょうか。 「多用」と言われると、やめた方がいいかな、と思います。 staticメソッドは、ちょっと特殊なメソッドです。 staticメソッドは、同じクラスの非staticな変数/メソッドをthis.someMethod()という風には呼べません。 自分のメソッドで処理を簡潔させるようにしておかないと非常に見通しが悪くなるように思います。 今回のケースではgetTimeメソッドから、TimeUtilクラスの他の変数やメソッドを呼び出してないので良いですが、 (例えば、getTimeメソッドだけを別のClassTimeUtil2クラスに移しても、getTimeメソッド内でエラーは出ないはず) 言い換えれば、他の変数やメソッドと関連のある処理はstaticにはしない方が良いと思います。 具体的には、ユーティリティクラスだと、いろんな所から呼ばれますが、 それぞれのメソッド自体は他のメソッドとの関連性は低いのでstaticメソッドがよく使われます。 (今回のTimeUtilクラスはそういう意味ではOKだと思えます) Javaのような「オブジェクト指向言語」は、オブジェクト(クラス)どうしの関連性を うまく扱っていくことが重要だと考えています。 親子関係、所有関係、時には間接的な関連などをうまく扱うと非常に効率的なものが作れます。 static変数/メソッドはこういった関連性から切り離された性質を持っているので、 本来のJavaプログラムのメイン処理で多用すべきではないと思います。 抽象的で、個人的な意見なので、非常に分かりづらい話だったかと思います。 複雑なシステムをJavaで効率的に実現するためには避けて通れない部分もあるような気がします。 Javaと長く付き合っていくなら、staticの多用は避けた方が良いかな、というのが個人的な見解です。
その他の回答 (2)
- matchasoft
- ベストアンサー率54% (20/37)
オブジェクトやクラス変数などが、どのようにメモリに確保されるかを考えながら作るといいと思います。 例えば、 public class TimeUtil{ private Date date; } とした場合のdateフィールドはオブジェクトごとに別々のメモリ領域が確保されますが、 public class TimeUtil{ private static Date date; } とした場合は、dateフィールドは実行環境内で一意に確保されます。 こういうクラス変数を使う場合は、マルチスレッド環境では複数のスレッドから同じ領域が参照されることになります。
このメソッドのパターンではありえません。
お礼
ご回答ありがとうございます。 この「static」は多用していいものなのでしょうか。 使用する際に コンストラクタに引数がある場合には、 TimeUtil timeUtil = new TimeUtil(引数); の宣言が必要だと思うのですが、 TimeUtil timeUtil = new TimeUtil(); を宣言せずに TimeUtil.getTime(iFormat); として使用できるので便利かと考えていまして。