#はじめに
Javaのことを少し勉強したので、修飾子のstaticについて書いていきたいと思います。
この記事は、SLP_KBITその2 Advent Calendar 2016 - Qiitaの20日目の記事です。
間違った点がありましたらご指摘お願いします。
#staticおじさんとは
staticメソッドはインスタンスを生成しなくてもクラスから直接呼び出せるのでstaticを多用する人がいます。
そのような人を「staticおじさん」と呼んだり呼ばなかったりします。
#staticとは
メソッドやメンバ変数にstatic修飾子を付けると、staticメソッド、static変数になります。
static修飾子を付けると何が変わるかというと、newしなくてもそのメソッドやメンバ変数にアクセスできるようになります。
つまりstaticとは、
・共通のメソッドを定義する場合
・共通のプロパティを定義する場合
・複数クラス間で共通のプロパティを共有したい場合
に使う修飾子ということです。
#なぜstaticを乱用してはいけないのか
これには様々な理由がありますが、一例をあげると、staticメソッドや変数は、ある所で変数の値を変更されたら他に参照しているところ全てに影響が出ることになります。
よって、staticを乱用することは、混乱の原因になります。
#staticはどのように使うべきなのか
##staticではないプロパティ・メソッド
では実際にコードを見ながら説明していきます。
public class Human {
private String name;
private int satiety; //満腹度
public Human(String name, int satiety) {
this.name = name;
this.satiety = satiety;
}
public void eat(int amountfood) {
this.satiety += amountfood;
}
}
上のコードは、人間オブジェクトを作るためのHumanクラスです。
このクラスには2つのプロパティと2つのメソッドがありますが、全て非staticなプロパティとメソッドです。
非staticなプロパティ・メソッドは、インスタンス固有のものです。「名前」は「人間」が共通の名前を持っているのではなく「個人」一人一人が持っているものなのでインスタンス固有のものです。また、「空腹度」や「食べるという動作」も一人一人個別に持っていたり行ったりするので、インスタンス固有のものです。
##staticなプロパティ・メソッド
では、先ほどのHumanクラスにstaticなプロパティを追加してみます。
public class Human {
static int count_Human = 0;
private String name;
private int satiety; //満腹度
Human(String name, int satiety) {
this.name = name;
this.satiety = satiety;
count_Human++;
}
public void eat(int amountfood) {
this.satiety += amountfood;
}
}
staticなプロパティ「人数」を追加しました。
Humanメソッドが呼ばれると、「人数」を増やします。
では何故「人数」はstaticなのでしょうか。
それは、「人数」は、インスタンス固有のものではなく、クラス固有のプロパティだからです。
「人間」の「名前」はなんですか?と聞いても分かりません。なぜなら「名前」は「個人」のものだからです。では、「人間」の「人数」は何人ですか?と聞かれると答えることができます。なぜなら「人数」は「人間」のクラスのプロパティだからです。
このように、クラス固有のプロパティやメソッドを作りたいときにはstaticを使うようにしましょう。
#まとめ
staticは便利ではありますが、乱用すると値が上手く合わなかったり、自分でどのようなコードを書いていたか分からなくなったりと混乱を招きます。
なので、staticを上手に使って、staticおじさんにならないように頑張りましょう。