この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の14日目の記事です。
こんにちは、シアトルコンサルティングの 羽田野 と申します。
この度、弊社 シアトルコンサルティング株式会社 でAdvent Calendarに参加することになりました。
TeamTech Move the WorldをMissionに掲げ、日々全力で業務に取り組んでおります!
少しでも興味を持って頂けたら下記のサイトを覗いてみてください!
コーポレートサイト
https://www.seattleconsulting.co.jp/
Wantedly
https://www.wantedly.com/companies/seattleconsulting
よろしくお願い致します!
はじめに ~クラス内の定数にstaticいるの?~
今まで何も考えずにJavaのクラス定数の修飾子をprivate static finalとしていたけど、
クラス内でしか使わない定数に対してstaticをつける意味って何だろう?と思ったので調べてみた。
ターゲット
著者自身、未経験エンジニア2年目なのでJava初学者で同じような疑問を持った方に向けて書いてみました!
まずは各修飾子について
アクセス修飾子
private
- 現在のクラスからのみアクセス可能なことを示す修飾子
それ以外
static
-
クラスフィールドの宣言
※クラスフィールド:インスタンスを経由せずにクラスから直接に呼び出せるフィールドのこと
final
- オーバーライドの禁止を宣言する
こうしてみると…
private finalはクラス定数として
- privateでクラス内での呼び出しのみに制限する
- finalで上書き禁止にする
の意味があるのでわかる。
ただ、やっぱりstaticな定数にしてクラスフィールドにする意味はわからない…
大事になってくるのは...static変数とインスタンス変数の違い
疑問をより深く見ていくとどうやら大事になってくるのは「static変数とインスタンス変数の違い」のようだ。
それぞれのスコープが異なることが重要なよう。
※スコープに関してはシアトルコンサルティング株式会社 Advent Calender 7日目で小泉くんが書いてくれてるので見てみてください!
static変数
- クラスにつき1つ
インスタンス変数
- インスタンスに付き1つ
このことからわかるのは…
staticをつけていないと定数が存在するクラスをインスタンス化するたびに定数が初期化されるため、
メモリへのオーバーヘッドが大きいということになる。
逆に言えば、インスタンスを1つしか生成しない前提のクラスに関しては特に意味はない。
ただし、複数インスタンスを生成する場合にstaticをつけずに宣言すると、
コンストラクタでの初期化を許すことになるため、クラス固有の定数ではなくなってしまうことが問題のようです。
最後に
どうでしたか?
当たり前のようにつけて処理していた部分を素朴な疑問として調べてみると発見があって面白かったです!
個人的には実装をすすめる中で前提や仕様が変わったために複数インスタンスを生成する必要が出てくる可能性等を考慮すると、おまじないのようにつけておくのが無難かなと納得しました。(デメリットも大きくはなさそうですし!)
今回は以上です。
ありがとうございました!
参考
https://qiita.com/Qiitaman/items/743013921e3ed31d948f
https://qiita.com/morioheisei/items/c56ab32b68ce92d32206