staticおじさんにならないために

  • 5
    いいね
  • 2
    コメント

はじめに

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ではないプロパティ・メソッド

では実際にコードを見ながら説明していきます。

Human.java

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なプロパティを追加してみます。

Human.java

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おじさんにならないように頑張りましょう。

引用: 【Java】 staticって何?

この投稿は SLP_KBITその2 Advent Calendar 201621日目の記事です。