16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【Java】private static final とは何ぞやという話

ふとした疑問

そのクラスでのみ使う定数を宣言する際に、割とありがちな、

"private static final"

ですが、これって果たしてstaticである必要はあるのか? という話です。


ちょっと考える

まず、privateな定数というものはそのクラスでしか使われないわけです。

ということは、このクラス自体がstaticでない場合(staticメソッドを持っていない場合)には、

この定数にアクセスするにはクラスをインスタンス化してやる必要があるわけです。

しかし、インスタンス化しているということはもはや定数がstaticである必要はないということであり、

「だったら"private static"なんて要らないじゃん!」

となるわけです。


そんなことはない

では本当に"private static"なんて要らないのかというと、そんなことはありません。

static変数(定数)とインスタンス変数の違いは、

「クラスに1つ」なのか「インスタンスに1つ」なのかという違いですから、

クラスからインスタンスを複数生成することがある場合には、これらを使い分けることに意味があります。


例をあげるならば、

定数などはstaticにしておくことでインスタンスごとではなくクラスに1つだけ持つことになり、

メモリが抑えられます。

他には、そもそもクラスからインスタンスがいくつ生成されているのかを保持する変数などには、

staticな変数が使えます。


結局

当たり前と言えば当たり前ですが、"private static"には独自の意義があります。

ですが、それはクラスからインスタンスが複数生成される場合に発揮されるものであり、

インスタンスを1つしか生成しないことを前提としているクラスにとっては特に意味はありません。

と、いうことかな?


まぁ、少なくとも定数に関してはstaticにしておくことにデメリットは特になさそうなので、

何も考えずに、「定数は"static final"」

でもいいのかなぁと思いました。