• ベストアンサー

staticのメリット、デメリット

hiraku-jpの回答

  • ベストアンサー
回答No.8

No.7にちょっと、訂正です。。。 >>DBのコネクションはクラス変数で、 >>外部のクラスをnewしております。 >対象のメソッド内でnewして、その参照をローカル変数 >に代入しているのならば、他のスレッドにその参照 >を渡さない限り(自分からしかアクセスできないの >だから)大丈夫です。 生成したインスタンス(コネクション)の参照をクラス変数に格納しているんですね。 早とちりでした。ごめんなさい。 で、この場合はこのクラス変数の参照先を変えられたくないのに他のスレッドにも変える手段を公開している場合や、このクラス変数の参照先のインスタンスがスレッドセーフでないのに同時にアクセスできる場合は問題ですね。 コネクションの生成だけが目的ならそのままリターンするでしょうし、このメソッド内でこの後使用する為ならローカル変数で十分でしょうし・・ 生成したコネクションをクラス変数に格納する目的はどのようなものなのでしょうか?

taka451213
質問者

お礼

こんにちは。 何度もありがとうございます。 >>生成したコネクションをクラス変数に格納する目的はどのようなものなのでしょうか? 私もわからないんです・・・。 そのソースを見た瞬間、危ないんじゃないかな?って思ったもので。 今回の質問の次第となりました。 クラス変数をローカル変数に変更して、各メソッドの引数に与えて持ち回るように変更してみました。 今回のプロジェクトは途中参加(コーディングはほぼ完了していた)ですので、あまり把握できていません。 ただ全体を見る限りでは、かなりやばそうです・・・(スレッドセーフ)。 このあたりで締め切ります。 後は自分で勉強して、頑張ってみます。 たくさん回答をいただきまして、ありがとうございました。 この場を借りて、皆様にお礼申し上げます。 また質問するかも知れませんが、よろしくお願いします。 皆さんにポイントをつけたいのですができませんので・・・(このシステム、変更して欲しいです)。 つかなかった方ごめんなさい。 優劣つけられません。 本当に、ありがとうございました。 (^^ゞ

関連するQ&A

  • staticメソッドにするかどうかの判断

    staticメソッドの使いどころについて質問させてください。 まず、メソッドの内部で、そのメソッドが定義されているクラスのイ ンスタンス変数を使用している場合は、そのメソッドはインスタンス に依存するので、インスタンスメソッドにしかできないのはわかり ます。疑問なのは、「じゃあこのメソッド内でインスタンス変数を使 わないで引数で渡せるように作れば、インスタンスに依存しないの でstaticにしていいの?」(※)ということです。 さらにこうも思います。 なんとなくですが、※のようなことをしたらオブジェクト指向の意味 がない気がします。理由ははっきりわかりません。ほんとになんとなく です。(奇跡的にあたっていたとしても、理由を教えて下さいm(_ _)m) そして、さらに混乱するのが、ユーティリティの関数などでstaticメ ソッドになっているのを見ました。この場合はどうしてメソッドの引 数を指定するようにしていて、クラスのインスタンス変数を使うこと はしないのか。 以上、大変下手な文章ですが、混乱しているポイントが伝わったでし ょうか? よろしくお願いします。

  • 問題の解説お願いします。(オーバーロード&オーバーライド)

    class A{ protected int method1(int a , int b){ return 0; } } クラスAを継承したクラスで同時に定義できるメソッド が、 public int method1(int a,int b){return 0;} が良くて private int method1(int a,int b){return 0;} static protected int method1(int a,int b){return 0;} がだめな理由がいまいちわかりません。 法則みたいなものにこう書いてありました。 (オーバーロードについて) 同一クラス内に同一名称のメソッドを定義することができます。 ただし、それらは引数が異なるものでなければならず、 アクセス制御修飾子や戻り値の型だけが異なるメソッドは 定義することができません。 (オーバーライドについて) サブクラスでは、スーパークラスに存在するメソッドと同一引数・ 同一戻り値型を持つメソッドを定義することが許されています。 これら以外にも何か決まりがあるのでしょうか よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのstaticメソッドの意味を教えて下さい

    Javaのstaticメソッドの意味を教えて下さい。 現在の解釈では、staticなメソッドとはインスタンスの生成に依存せず呼び出せる処理のことだと認識しています。逆にstaticでないメソッドは、生成後のインスタンスにしか使えない処理だと理解しています。 しかし、コンストラクタがstaticでないことに気がつき、疑問が生まれました。コンストラクタはstaticではないので、コンストラクタを呼び出す時にはそのクラスのインスタンスが必要になるはずです。しかしこのインスタンスを作るのにもコンストラクタが必要です。コンストラクタを使うためにインスタンスが必要で、インスタンスを作るためにコンストラクタが必要という無限ループになってしまいました。 そこで改めて、staticメソッドの意味を教えて頂きたいです。

  • 「static宣言されているメンバ関数」は、「インスタンスメソッド」な

    「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか? 先日、下記内容で質問して、その時は分かったつもりだったのですが、 やっぱり分かってなかったようなので、教えてください。 ▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。   http://okwave.jp/qa/q5858806.html 例) ▽前提 ・Aクラスのインスタンスa ・static宣言されたpublicメソッド「static_public_method」 ・static宣言されていないpublicメソッド「public_method」 ▽メンバ関数呼び出し ・$a->static_public_method() ・A::static_public_method() ・A::public_method() このとき、「$a->static_public_method()」は、インスタンス経由でアクセスすることになるので、 「インスタンスメソッド」になるのでしょうか。それとも、static(静的)宣言しているので、「クラスメソッド」になるのでしょうか? また、「A::static_public_method()」や、「A::public_method()」は、どちらになるのでしょうか? ※現在、頭の中がこんがらがっているのは、下記3点です。どれかひとつでも構わないので、分かりやすい考え方等あれば、ぜひ教えてください。 ・「static宣言したメンバ関数」は、「インスタンスメソッド」? 「クラスメソッド」? ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由 ・「A::static_public_method()」と「A::public_method()」の違い

    • ベストアンサー
    • PHP
  • static 変数について

    static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }

  • メソッドの呼び出し方(static参照したくない場合は??)

    いつもお世話になっております。 いつまで経ってもJavaが理解できないでいる初心者tak315です(涙) 今作っているWebアプリで、開発者全員が使う共通クラスがあります。 メソッドを呼び出したいのですが、 *-------------------------* 型 [クラス名] から非 static メソッド [メソッド名]に static 参照することはできません。 *-------------------------* というエラーがでます。 どちらもstaticじゃないので、そりゃそうなんでしょうが、 static参照しない場合の呼び出し方がわかりません。 eclipseのアシストだと、呼び出し元をstaticにすればいいじゃん。 と言われるのですが、共通クラスなので、勝手に変更できません。 メソッドの呼び出し方自体まだよくわからず、 大変困っております。。。 [クラス名] [小文字クラス名] = new [クラス名].[メソッド名()]; なんて書けば使えるんじゃ…と思ったけど、使えませんでした。 なにぶん、Javaをわかっていないもので、 説明不足なところがあるかも知れません。 補足でいくらでも答えますので、 足りていない説明などもご指摘いただければありがたいです。 そして、やさしく教えてほしいです。。。 どうか、よろしくお願い致します。

    • ベストアンサー
    • Java
  • Pythonのコードself多すぎ読み書きしにくい

    Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。 Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。 Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。 (例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん) class Sample: def __init__(self): self.L = [] # Lは数値のリスト def setList(self, L): self.L = L def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた # 値に、大きい方を小さい方で累乗した値を加える if self.L[i1] > 0 and self.L[i2]: if self.L[i1] > self.L[i2]: return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2] else: return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1] イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。 「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか? どうぞよろしくお願いします。

  • staticメソッドはどう使う?

    質問させてください。 Java初心者です。 staticメソッドは、どのようなときに使用するのでしょうか。 mainはともかくとして、他の場合は全てインスタンスメソッドにしてしまえばよいと思うのですが・・・。 どなたか教えていただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス内の関数内static変数について

    クラス内の「staticではないメンバ関数内で定義される」static変数の初期化タイミングはいつでしょうか? 自分としてはクラスのインスタンス生成時に初期化されるものだと思っていたのですが、どうもそうでは無さそうだという現象に出会ったもので。 例えば以下のようなサンプルプログラムがあるとします。 --------------------------------------- class TA { public: void func(int i); }; void TA::func(int i) { static int d=0; d += i; std::cout << d << std::endl; } int main() { for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); } } --------------------------------------- これを実行した時、自分としては 1 2 3 2 4 6 という結果を期待していた訳ですが、実際には 1 2 3 5 7 9 という結果になりました。 ということは、もしかしてメンバ変数ではなくともクラス内に現れるstatic変数はstaticなメンバ変数と同等ということなのでしょうか? 実際、上記ソースのforループ内にもう一つclass TAのインスタンスtbを追加してみると、 --------------------------------------- for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); TA tb; tb.func(i); tb.func(i); tb.func(i); } --------------------------------------- 1 2 3 4 5 6 8 10 12 14 16 18 となりました。 (まぁstaticではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

  • staticメソッドの長所短所

    初めまして。 c言語からjavaの勉強を始めたものです。 javaには共通ライブラリをstaticなメソッド(この言い方に慣れない)で作ることが多いようですが、なぜですか? 私の認識は、 staticはメモリの共有領域に確保され誰からも参照できる。 よって、メモリの効率的な確保が出来る。 でも、メソッドを共有領域に持つと各ユーザからそのメソッドが呼ばれたときに同じメモリをさすメソッドが使用される。 つまり、違うユーザがパラメタ違いで同じメソッドを使用すると、処理の途中でパラメタが書き換わってしまう可能性があるかと思います。 これって問題ないのでしょうか? Sumple public static boolean check(String str){ if(str==null){ return false; } int num = Integer.parseInt(str); if(num < 0){ retrun true; } else { retrun false; } } こんなメソッドがあり、パラメタが「2」の人と「-10」の人が同時にアクセスすると結果が変わりそうな気がします。 よろしくお願いします。