👽

【オブジェクト指向】Staticメソッド・プロパティ

1 min read

staticを使うとnew演算子を利用しなくても、メソッドやメンバ変数を呼び出せます。そのため、コードがシンプルになります。

コードがシンプルになる以外で、staticと非staticの違いは何でしょうか。TSでサンプルコードを書いたので見てみます。コードは、山田さんが呼ばれた回数を出力するという単純な内容です。

static

staticの場合、処理はインスタンスに依存せず、クラスに依存します。そのため、Humanクラスはcallプロパティの状態を保持し続けており、Humanクラスを呼び出すたびにcallプロパティが加算されます。

class Human {
    static call = 1

static get(name :string) {
        return `${name}: ${this.call++}`
    }
}

console.log(Human.get('yamada')) // yamada: 1
console.log(Human.get('yamada')) // yamada: 2
console.log(Human.get('yamada')) // yamada: 3

非static

非staticの場合、処理はクラスに依存せず、インスタンスに依存します。そのため、Humanクラスはcallプロパティの状態を保持しません。Humanクラスを呼び出すたびに、callプロパティは初期値を出力するため加算されません。

class Human {
    public name
    public call = 1

    constructor(name: string) {
        this.name = name
    }
    get() {
        return `${this.name} ${this.call++}`
    }
}

console.log(new Human('yamada').get()) // yamada 1
console.log(new Human('yamada').get()) // yamada 1
console.log(new Human('yamada').get()) // yamada 1

非staticでcallプロパティを加算したい場合は、このようにインスタンスに依存させます。

class Human {
    public name
    public call = 1

    constructor(name: string) {
        this.name = name
    }
    get() {
        return `${this.name} ${this.call++}`
    }
}

const human = new Human('yamada')
console.log(human.get()) // yamada 1
console.log(human.get()) // yamada 2
console.log(human.get()) // yamada 3

staticの使い所

staticの使い所は、インスタンスを複数必要とするかどうかです。インスタンスを複数必要とする場合は、staticを使いません。

動物で例えると同じ犬種でも個体によって、年齢・体高・体重が異なります。この場合はインスタンスに依存して、呼び出し結果が異なるものを取得するようにします。つまり、その個体固有の情報を持たせる必要があります。

一方でstaticの場合は、引数が同じであれば結果は同じになります。結果は引数以外に依存しないため、先程の動物の例のようにインスタンス毎に結果が異なるといった処理は行いません。例えば、現在の時間や三角形の面積(公式が決まっているもの)など、属性に関係なく決まるものに対して使います。

Discussion

ログインするとコメントできます