定数につけるべき修飾子はなんでしょうか?
経験上「static final」としていることが圧倒的に多いです。
どんなときも必ずそうする意味はあるのでしょうか?
私には、考慮不足でとりあえず「static final」としているだけで
実際には場合によって使い分けたほうがいいのではないだろうかと思っています。
しかしあまりにも「static final」としている数が多いので
何か特別な意味があるのでは無いかと思っています。
例えば
・24時間365日稼動のシステム
・1日1回バッチ処理を行なう
・そのバッチ処理の中だけで使用する定数
こういう場合にはメモリ上の展開を考慮すると
「static final」よりも「final」にした方がいいように思えます。
でもそうせずに「static final」としていることが多いです。
定数の修飾子は、その使われ方・場合によって使い分けるべきでしょうか?
それともどんなときも「static final」とすべきでしょうか?
どちらであるか(もしくはそれ以外)とその理由を教えてください。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
誰もそもそもの概念に触れていないのが気になりますね。
「staticのついていないフィールドはstaticメソッドからアクセスできない」というのが近いといえば近いですが。おそらくご存知だと思いますが、staticメンバ「変数」というのは、そのクラスそのものに依存する変数であることを意味します。一方staticがつかない変数はクラスではなく、オブジェクトに依存する変数です。つまりstaticがつくかつかないかは、概念上の区別に基づいて決められるのです。これが「staticメソッドからはstaticでない変数にはアクセスできない」という実際のふるまいとして表れてきます。
では定数についてはどうか。これも変数と同じで、オブジェクト依存の定数にはstaticをつけないのが基本です。例えば、
final int number;
という定義をして、コンストラクタで、例えば引数に応じて値を代入することができます。これでオブジェクトごとに異なる定数が作れますよね。
というわけで、概念に応じてstaticを使い分けるのが基本です。クラスの設計段階で、ある変数・定数がクラスに基づくものかオブジェクトに依存するものかをきちんと区別すべきです。
これはJavaに限らずCなどでも共通認識ですので、メリットはそのままです。つまりstaticがつくものはクラス依存の定数なのだな、と他人が見て一目で分かることです。メモリ効率やアクセス速度などの点からこのルールを逸脱する場合は、コメントなりドキュメントなりに残すべきでしょうね。
>オブジェクト依存の定数にはstaticをつけないのが基本です。
なるほど。すっきりしました。
>概念に応じてstaticを使い分けるのが基本です。
>クラスの設計段階で、ある変数・定数がクラスに基づくものか
>オブジェクトに依存するものかをきちんと区別すべきです。
やはりそうですよね。本来そうすべきな気がするのに
何も考えずなんとなくstaticをつけているとしか思えない
ケースが多いように感じ質問をしてみました。
自分の考えに自信が持てました。
大変参考になりました。ありがとうございました。
No.3
- 回答日時:
>「static final」でも「final」でもどっちでもいい、
>「static final」が多く使われることに何も根拠は無い、
>ということでしょうか?
staticやfinal修飾詞の意味は理解されている前提で話をしておりますが、このへんは開発される方、そのプロジェクトのコーディングルールなり定数やプロパティの扱いの仕方次第ではないかと。
(なので決まった答えはない)
メモリやその他を気にするよりも、そのプロジェクト内での取り決めに従えばいいのでは?ということです。
>・そのバッチ処理の中だけで使用する定数
こういうのはローカル定数でもいいとは思います。
この回答への補足
質問は「決まった答えがあるのか無いのか」ではありません。
プロジェクトの取り決めでも開発者個人の考えでも何でもいいのですが
すべての人が何の根拠もなく選択しているのか、
何か根拠があって選択しているのか、根拠があるのなら
どのような根拠に基づいているのかそれを教えていただきたいのです。
「…のような違い・メリットがあるから、この方法を選択している」
等の説明を期待しています。
この世のすべてのパターンを網羅して答えてください
といっているつもりはまったくありません。
メジャーなもの1パターンでもいいので例を挙げて説明していただきたいです。
よろしくお願いします。
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; }
}
>staticフィールドならばstaticメソッドからもそうでないメソッドからも問題なくアクセスできて便利です。
あぁ、なるほど。確かにそうですね。
staticメソッドから呼ばれることは無いと確定しているときに「final」にし、
staticメソッドから呼ばれるかもというときに「static final」にするということですね。
その視点は抜けていました。
参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード件数の表示
-
【アクセス修飾子】アクセス修...
-
return new使用時
-
String.containsの反対機能はあ...
-
説明文書でのメソッド・変数の...
-
Java初心者です。例外のキャッ...
-
コマンドライン引数のチェック
-
Google Apps Script で getRang...
-
java ジェネリックスに関して
-
メソッドの引数に指定されてい...
-
Strutsでチェックボックスの値...
-
Jakarta POI での、excelのシ...
-
不要なstaticメソッドの見分け...
-
クラス変数とクラスメソッドを...
-
アプレットのinitは、なせ"publ...
-
クラスを継承した際のコード自...
-
クラスに行って、戻ってくる方法
-
voidとかstaticとか
-
Java初心者です、エラーの意味...
-
androidのインターフェースにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
C# 点の描き方をおしえてくだ...
-
Google Apps Script で getRang...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
なぜprotected overrideなのか
-
Java初心者です、エラーの意味...
-
Strutsでチェックボックスの値...
-
メソッド宣言の戻り値の型にク...
-
abstract と static を一緒に付...
-
return new使用時
-
Javaの関数名が長い?
-
メソッドの引数に指定されてい...
-
クラスを作るとメソッドの数が...
-
public static void main (Stri...
-
説明文書でのメソッド・変数の...
-
readLine()ではじめから読み直...
おすすめ情報