• ベストアンサー

private static という変数の修飾

お世話になります。 private static final String HOGE = "hoge"; という変数(finalなので定数ですが)があるとします。このような、privateでstaticな変数というのは、どのような使われ方を意図しているのでしょうか?privateな変数がstaticである必要は、どのようなときに生じるのでしょうか? よろしくご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 その private な変数が所属するクラス自身がいくつも定義された場合に、プログラム全体で1つのメモリしか確保されなくなります。  なんで、メモリ量がものすげー切羽詰ってるときとか、ほんの数バイトでも節約した方がいい気がするときに有効です。

noname#21585
質問者

お礼

ありがとうございました。かなり納得できました。逆にそのようなメモリの節約を意識する必要がないときは、変数をprivate staticにする必要もないということになるのでしょうか?よろしければまたご教授ください。

その他の回答 (8)

  • bnosuke-x
  • ベストアンサー率39% (43/110)
回答No.9

private static な変数の存在意義は十分にあると思います。 キーワードの効果を考えると、 private ------- クラスの外から見る必要が無く or いじられては困る static ------- クラスを通して一つだけでいて欲しい という変数が欲しいときに使う事になります。 応用例は#8さんの通りだと思います。 私はマルチスレッドのネットワークプログラミングで、同時接続数のモニタリング&制限のために使ったことがあります。 1インスタンス=1接続。 始まったら増やして終わったら減らす。 public final なメソッドで数値を取得して、ウィンドゥに接続数をリアルタイム表示をする。 という感じです。 public メソッドを用意するなら、なぜ変数がprivate?と思うかも知れませんが、いわゆるカプセル化と設計思想でこうなりました。 >privateな変数であるならばインスタンスごとに値を持てばいいのに static 変数は、上記の通り「クラス全体で一つの」ものになり、 インスタンス内の変数は「インスタンスごとの」ものになります。 ここが使い分けのポイントでしょう。 おまけ #4の方 別にstaticでなくとも、マルチスレッドを使えば全方位に気をつかうので、あまり関係ないと思います。

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.8

素人です。自信なし。 --- staticを使う場面は (A)staticでなければならない場合 (B)staticであってもなくても「どっちでもよさそう?」な場合(※intの定数とか) (C)staticなメソッド専用の"グローバル変数" あたりがあると思います。 「よく目にする」のは、BかCだと思うのですが、 「(A)でかつprivate」の例は、 あんまり使う場面に遭遇しないかも。特殊と言うか。 思いつくのは、 ・(あるクラスの)全インスタンスに対して「等しい」指示を与えるもの・ 「等しい指標」となるもの (で、このメンバ自体は(何らかの理由があって) privateであるが、このメンバへのアクセス用に"非privateな"メソッドが 用意されてるもの) ・(あるクラスの)全インスタンスのみで共用される、  同期用のロックオブジェクト   ・インスタンス数カウンタ/インスタンス自動ナンバリング ・そのクラス固有の「何か」を同定(証明)するためのキー

回答No.7

>ちなみに、変数が、自クラス以外からのアクセスはできないが、静的に値を保持する必要がある場合というのは、1番の方がご教授くださった「メモリの節約」という場合の他にどのような場合があるでしょうか? 以下のサイトによると、 「状態をスレッドに関連付けようとするクラスでの private static フィールドです (ユーザ ID、トランザクション ID など)。」 とのことです。でも、ふつう、一意制約違反とかって、DB絡みじゃなかったかなーとも思うのですが、同じThreadでも応用レベルになってくると、お手上げ状態です。(どなたか、フォローお願いっす。)

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/ThreadLocal.html
noname#25358
noname#25358
回答No.6

>逆にそのようなメモリの節約を意識する必要がないときは  少なくとも俺はやりませんね。  常にではないと思いますが、#4の方のおっしゃるような問題が発生することもあるんで、気分的になんか嫌……。

noname#45950
noname#45950
回答No.5

No.2さん同様、特に特殊なことでもないと思いますが・・・。 「定数」をどのような時に使うか、理解されてますか??

  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.4

static で変数を定義してしまうと、全てのインスタンスで共通に使用されて しまうので、同期処理が正しく行えるコーディングを考慮する必要が あるため、とても注意が必要です。 static の変数で特徴的なのは、static であるため、インスタンスを 生成しなくても呼び出せるという点があると思います。 つまり、staticの関数からでも利用できるという点です。 「privateでstaticな変数」を使うもので真っ先に思い浮かぶのは、 シングルトンパターンだと思います。

回答No.3

有効な利用方法になるかどうか設計次第かと思われますが、 この変数が定義されているクラス内にインナークラスを定義した場合、 staticにアクセスすることが可能です。 が、肝心のその利用方法ですが、あまりそのような局面にであったことは無いので特別考えたことはありませんが・・・。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

これはその名前の通り、「静的に値を保持する必要があるが自クラス以外からのアクセスはできない」という変数になります。 定数なら、自クラス内でのみ使用する定数ということでしょうか。 何も特殊な事例ではありません。

noname#21585
質問者

お礼

ありがとうございます。privateな変数であるならばインスタンスごとに値を持てばいいのにという印象を受けるのでこのような疑問が生じた次第でありますが、よくよく考えてみれば例のように定数の場合ならば、どうせ定数なんだからインスタンスごとに値を持つ必要もないと考えるべきなのでしょうかね。ちなみに、変数が、自クラス以外からのアクセスはできないが、静的に値を保持する必要がある場合というのは、1番の方がご教授くださった「メモリの節約」という場合の他にどのような場合があるでしょうか?よろしければまたご教授くださいませ。

関連するQ&A