• ベストアンサー

private static という変数の修飾

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

noname#21585
noname#21585
  • Java
  • 回答数9
  • ありがとう数7

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

  • ベストアンサー
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

  • staticオブジェクト内の変数

    staticなオブジェクト内のローカル変数は、スレッドセーフだと思うのですが、あっていますでしょうか。 例えば、以下の myfoo変数内の、data変数のようなケースです。 public class foobase() { private static foo myfoo = new foo(); . . } public void foo() { String data = "Hello"; }

    • ベストアンサー
    • Java
  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • staticなフィールドをstaticじゃないメソッドで使うには?

    いつもお世話になっています。よろしくお願いします。 javaで、staticなメインメソッドからも、staticじゃないメソッドからも1つの メンバ変数(フィールド)を処理したいと思います。 private static String nr; というフィールドを宣言しました。 (staticであるmainメソッドの中で使えるようにstaticで宣言しようと思いました。) 次に、 private void Kensaku() { このstaticではないメソッドの中でString nrを使って処理を行いたいです。 } 初歩の初歩なことを質問してすみませんが、調べても分かりませんでした。 どうか、よろしくお願いします。

    • ベストアンサー
    • Java
  • システムプロパティのキーの定数について

    * 暇なときにでも システムプロパティのキーの定数について これは、定数にする必要があるのでしょうか? "user.dir"は、javaで用意されているシステムプロパティのキーで, もともとこの形で用意されているのにも関わらず、定数にする必要はあるのでしょうか? (1) private final static String USER_DIR = "user.dir"; private final static String CURRENT_DIRECTORY = System.getProperty(USER_DIR); (2) private final static String CURRENT_DIRECTORY = System.getProperty("user.dir"); (1)、(2)でどちらがいいのかわかりません。 クオリティが高い書き方は、やはり(1)の書き方なのでしょうか?

    • ベストアンサー
    • Java
  • 数値の定数を付ける時

    数値の定数名を付ける時、悩みます。 String[]の入力数の状態により処理が異なるとき この書き方では格好悪いです。 private static final int ZERO = 0; private static final int ONE = 1; private static final int TWO = 2; 上記に変わるもの private static final int NOT_VALUE = 0; private static final int ●●● = 1; private static final int △△△ = 2; ●●●と△△△に適切な定数名が思いつきません。 どういう風に考えたらいいのでしょうか?

    • ベストアンサー
    • Java
  • static変数を持ったクラスを継承した複数のクラスで、独立してその変

    static変数を持ったクラスを継承した複数のクラスで、独立してその変数を使いたい。 例えば、 class AbstractStatic{ public static String str; } class Ex1 extends AbstractStatic{} class Ex2 extends AbstractStatic{} というクラスがあったとして、 Ex1 e1 = new Ex1(); ex1.str = "hoge"; といれると、 ex2.str で、hogeが入ってしまいます。同じようなstatic変数を持つクラスを複数作りたいのですが、継承させると、独立して変数を持たせられません。 同じようなクラスに直接static変数を、記述するしかないのでしょうか?

    • ベストアンサー
    • Java
  • Static変数の必然性について

     今晩は、Cの初心者です、宜しくお願いします。    Global変数とStatic変数の違いがよく分かりせん。  本を読むと、Global変数は「常に同じメモリ上に置かれどの関数からも使用できる」、Static変数は「常に同じ メモリ上に置かれ定義された関数からのみ使用できる」とかいています。  Global変数がどのようなもので、その必要性みたいなものは理解出来るのですが、Static変数については、 Global変数との違い、その必要性、実際にどのような場合に使うのかその必然性みたいものがあるのか理解できません。  いくら本を読んでも、理解出来ないのですが、宜しくご教示願います。

  • 定数につけるべき修飾子は?

    定数につけるべき修飾子はなんでしょうか? 経験上「static final」としていることが圧倒的に多いです。 どんなときも必ずそうする意味はあるのでしょうか? 私には、考慮不足でとりあえず「static final」としているだけで 実際には場合によって使い分けたほうがいいのではないだろうかと思っています。 しかしあまりにも「static final」としている数が多いので 何か特別な意味があるのでは無いかと思っています。 例えば ・24時間365日稼動のシステム ・1日1回バッチ処理を行なう ・そのバッチ処理の中だけで使用する定数 こういう場合にはメモリ上の展開を考慮すると 「static final」よりも「final」にした方がいいように思えます。 でもそうせずに「static final」としていることが多いです。 定数の修飾子は、その使われ方・場合によって使い分けるべきでしょうか? それともどんなときも「static final」とすべきでしょうか? どちらであるか(もしくはそれ以外)とその理由を教えてください。 よろしくお願いします。

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

    struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, ... }; thread(){ ... } 上記のstatic変数をスレッド関数thread()の外部変数として設定した場合、 *aaaの値はスレッドごとには確保することできませんでしょうか。 上書きされてしまうのでしょうか。 やはりスレッドセーフではないのでしょうか。 その際、どのように設定してあげればよいのでしょうか。 どなたかご教授お願いします。

  • static修飾子の使いどころ

    現在、Java言語でネットワークプログラムを作っています。 このプログラムでは、どのIPが自分のPCとつながっているかを全て把握することが必要になってきます。 しかしながら、作り込んでいくうちにクラスが増えてきました。 そこで、IPアドレスなどのネットワーク情報を一気に管理できないかと考えた末、staticメンバを持ったクラスを作ろうという考えに至りました。インスタンスに依存しない、いわばDBのような形式を以て、管理できると考えたからです。 そこで、いくつか質問があります。 ・「DBのような形式」というニュアンスで間違っていないか ・↑の質問とほぼ同じですが、staticフィールドは「グローバル変数の代わり」としてみてもよいか 以上の2点です。 ちなみに、そのstaticメンバを持つクラス内のメソッドは、staticフィールドの内容に関わるものなので、一応、オブジェクト指向の線からは外れていないと思います。 また、もし使い方が間違っているということでしたら、どのように全体的な情報を管理していくべきかご教授頂けると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう