• ベストアンサー

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

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

  • Java
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.4

誰もそもそもの概念に触れていないのが気になりますね。「staticのついていないフィールドはstaticメソッドからアクセスできない」というのが近いといえば近いですが。 おそらくご存知だと思いますが、staticメンバ「変数」というのは、そのクラスそのものに依存する変数であることを意味します。一方staticがつかない変数はクラスではなく、オブジェクトに依存する変数です。つまりstaticがつくかつかないかは、概念上の区別に基づいて決められるのです。これが「staticメソッドからはstaticでない変数にはアクセスできない」という実際のふるまいとして表れてきます。 では定数についてはどうか。これも変数と同じで、オブジェクト依存の定数にはstaticをつけないのが基本です。例えば、 final int number; という定義をして、コンストラクタで、例えば引数に応じて値を代入することができます。これでオブジェクトごとに異なる定数が作れますよね。 というわけで、概念に応じてstaticを使い分けるのが基本です。クラスの設計段階で、ある変数・定数がクラスに基づくものかオブジェクトに依存するものかをきちんと区別すべきです。 これはJavaに限らずCなどでも共通認識ですので、メリットはそのままです。つまりstaticがつくものはクラス依存の定数なのだな、と他人が見て一目で分かることです。メモリ効率やアクセス速度などの点からこのルールを逸脱する場合は、コメントなりドキュメントなりに残すべきでしょうね。

mibusys
質問者

お礼

>オブジェクト依存の定数にはstaticをつけないのが基本です。 なるほど。すっきりしました。 >概念に応じてstaticを使い分けるのが基本です。 >クラスの設計段階で、ある変数・定数がクラスに基づくものか >オブジェクトに依存するものかをきちんと区別すべきです。 やはりそうですよね。本来そうすべきな気がするのに 何も考えずなんとなくstaticをつけているとしか思えない ケースが多いように感じ質問をしてみました。 自分の考えに自信が持てました。 大変参考になりました。ありがとうございました。

その他の回答 (3)

回答No.3

>「static final」でも「final」でもどっちでもいい、 >「static final」が多く使われることに何も根拠は無い、 >ということでしょうか? staticやfinal修飾詞の意味は理解されている前提で話をしておりますが、このへんは開発される方、そのプロジェクトのコーディングルールなり定数やプロパティの扱いの仕方次第ではないかと。 (なので決まった答えはない) メモリやその他を気にするよりも、そのプロジェクト内での取り決めに従えばいいのでは?ということです。 >・そのバッチ処理の中だけで使用する定数 こういうのはローカル定数でもいいとは思います。

mibusys
質問者

お礼

ありがとうございました。

mibusys
質問者

補足

質問は「決まった答えがあるのか無いのか」ではありません。 プロジェクトの取り決めでも開発者個人の考えでも何でもいいのですが すべての人が何の根拠もなく選択しているのか、 何か根拠があって選択しているのか、根拠があるのなら どのような根拠に基づいているのかそれを教えていただきたいのです。 「…のような違い・メリットがあるから、この方法を選択している」 等の説明を期待しています。 この世のすべてのパターンを網羅して答えてください といっているつもりはまったくありません。 メジャーなもの1パターンでもいいので例を挙げて説明していただきたいです。 よろしくお願いします。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

staticのついていないフィールドはstaticメソッドからアクセスできません。下のコード例のメソッドcはコンパイルエラーになります。 一方、staticフィールドならばstaticメソッドからもそうでないメソッドからも問題なくアクセスできて便利です。 public class A { private final int TEISUU1 = 123; private static final int TEISUU2 = 789; public int a() { return TEISUU1; } public int b() { return TEISUU2; } public static int c() { return TEISUU1; } ← コンパイルエラー public static int d() { return TEISUU2; } }

mibusys
質問者

お礼

>staticフィールドならばstaticメソッドからもそうでないメソッドからも問題なくアクセスできて便利です。 あぁ、なるほど。確かにそうですね。 staticメソッドから呼ばれることは無いと確定しているときに「final」にし、 staticメソッドから呼ばれるかもというときに「static final」にするということですね。 その視点は抜けていました。 参考になりました。ありがとうございました。

回答No.1

よほどメモリ管理がシビアなものでなければそれほど気にする必要もないのではないでしょうか?

mibusys
質問者

お礼

ありがとうございました。

mibusys
質問者

補足

「static final」でも「final」でもどっちでもいい、 「static final」が多く使われることに何も根拠は無い、 ということでしょうか?

関連するQ&A

  • 定数宣言

    定数を宣言時に、 public static final String SQL_QUERY = "select * from table" のように、宣言しているのを書籍やweb上で見ることがよくあります。 上記宣言のstatic修飾子について、なぜ使用するのでしょうか?

    • ベストアンサー
    • 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
  • JAVAでの定数追加

    定数1~定数100が定義されておりクラス(メソッド)内に定数を使用したif文が複数存在するとします。 ※if文の条件は定数(文字列)のstartWithによる比較 定数101を追加する場合に定数定義+if文の条件を追加しなければならないのですが、 定数定義のみで対応できるようにするにはどうすればよいでしょうか? 以下を考えてみましたが(不可もありますが・・・)もっと良い方法はありますでしょうか? 案1)×   Mapを使用。getする際にstartWithであるためできないことが判明。(equalsの比較なら可能)   private final static Map map = new HashMap(){    put("a1","");    put("a2","");       :    put("a101","");   } 案2)△  ArrayListを使用。   private final static List list = new ArrayList(){    add("a1");      :    add("a101");   }  メソッド内でfor文を使用するため性能的に落ちる?  for(int i=0;i<list.size();i++){   String str = "aaa";   if(list.get(i).startWith(aaa){     処理; } } 案3)正規表現で実施。定数値がさまざまなため断念。 例) private final static String a1 = "a1"; private final static String a2 = "a2";        : private final static String a100 = "a2"; public void methodA(){  String str = "aaa";  if(a1.startWith(str) || a2.startWith(str) || ・・・ a100.startWith(str)){   処理;  }   : } public void methodB(){  String str = "aaa";  if(a1.startWith(str) || a2.startWith(str) || ・・・ a30.startWith(str)){   処理;  }   : }

    • ベストアンサー
    • Java
  • Android static finalクラス

    static final classって何ですか? ▽R.attr | Android Developers   http://developer.android.com/reference/android/R.attr.html に「static final class」ってあるのですが、意味が良く分かりません。 ・「static final」フィールドと何が違うのでしょうか? ・どうしてフィールドにせず、クラスにしているのでしょうか? ・ただの定数ということでしょうか?

    • ベストアンサー
    • Java
  • 修飾語句の「の~」と「が~」

    少々お伺い致します。 修飾語句のことです。 例えば、 「彼女が書いた本」 「彼女の書いた本」 どちらも同じ意味ですし、日本語の文法としても間違っていないと思います。 ですが、修飾語句として次の名詞などへ係る場合、彼女が~、とするよりも、 彼女の~、とした方がよいと、その関係のサイトには書いてあります。ただ私が調べた限りではその理由が載っていないのです。 小説などを読んでいましても、やはりこのような場合、「が~」より「の~」の方が多いような気が致します。 この辺りの理由というか理屈のようなものを、教えていただけないでしょうか。 よろしくお願い致します。

  • 名詞の修飾のルールについて

    過去分子(形容詞?)が名詞を修飾する場合、 Scheduled maintenance Unsupplied hours  のように前から修飾している場合と All the parties involved Decision made のように後ろから修飾している場合がありますが この二つに意味や文法上のルールの違いがあるのでしょうか? 具体例がうまく見つけられず、質問の仕方も曖昧かもしれませんが どなたか分る方、教えて下さい。宜しくお願いします。

  • 数式を構成する問題

    トークンの種類を区別するための定数の定義が class TOK { public final static int plus = 0; // 演算子+ public final static int minus =1; // 演算子 – public final static int mul = 2; // 演算子* public final static int div = 3; // 演算子 / public final static int mod = 4; // 演算子 % public final static int id = 5; // 変数 public final static int const = 6; // 定数 public final static int u_plus =7;// 単項演算子 + public final static int u_minus =8;// 単項演算子 – public final static int assign =9;// 演算子 = (代入) public final static int lparen =10; // 左括弧 public final static int rparen =11;// 右括弧 public final static int END = 12;// 式の終わり } とあるとき、切り出すトークン毎に生成するオブジェクトの定義 class Token { // フィールド変数の定義 … 1) トークンの種類、2)数だった場合の値 // コンストラクタの定義 public Token(int Type) { 1文字トークンを作成 +,-,*,/,%,(,),= } public Token(int Type, int val) { 整数トークンを作成のコンストラクタ (type == TOK.costantで) } // メソッドの定義 public int getType() { トークンの種別を返す } public int getIntVal() { // このメソッドは定数トークンに対してのみ有効 トークンの整数値を返す } public String toString() { トークンの情報を文字列で返す } } というクラスを作成してください。お願いします。

  • 時定数について

    ご質問させていただきます。 時定数の式の中で、 e^-1=1/e≒0.37というような箇所があると思いますが、 e^-1って、e=2.7181・・・という数字を-1個、掛ければいいんですよね? それをしても、0.37という数にはならないですよね? なんかトンチンカンな質問ですいません。。。。 あと、expが式の中にある場合と、lnがある場合があるんですが、 どちらとも使い分ける意味があるのでしょうか。 勉強不足ですいません。どなたか回答いただきたいです。

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

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • 「化学修飾」と「化学装飾」

    科学用語の 「化学修飾」と「化学装飾」は、意味や使い方が違うのでしょうか。 なんとなく「化学修飾」の方をよく読んだりするので、 こちらが正解のような気もするのですが、 「化学装飾」でググると、こちらも使われているのです。 ちなみに、それぞれ一連の言葉として検索した場合。 "化学修飾" → googleで日本語のページとして約 70800 件 "化学装飾" → googleで日本語のページとして約 68 件 という結果になったのでおそらく「化学修飾」が一般的用語だと思うのですが、 それぞれ別個の意味があるのか、それとも「化学装飾」が誤用なのか、 はっきりとした結論が出せません。 ご存知の方がいらっしゃいましたらよろしくお願いします。

専門家に質問してみよう