web-dev-qa-db-ja.com

Javaクラスで使用される変数シャドウイングとは何ですか?

私は自分のDeitelを読んでいます、Java How to Program book and遭遇した用語shadowing。シャドウイングが許可されている場合、どのような状況または目的がありますか? a Javaクラス?

例:

public class Foo {

    int x = 5;

    public void useField() {
        System.out.println(this.x);
    }
    public void useLocal() {
        int x = 10;
        System.out.println(x);
    }
}
23
Jayson

シャドウイングの基本的な目的は、ローカルコードを周囲のクラスから切り離すことです。利用できなかった場合は、次のケースを検討してください。

APIのClassFooがリリースされました。コードではそれをサブクラス化し、サブクラスではbarと呼ばれる変数を使用します。次に、Fooは更新をリリースし、Barと呼ばれる保護された変数をそのクラスに追加します。

これで、予期していなかった競合のためにクラスが実行されなくなります。

ただし、意図的にこれを行わないでください。スコープ外で何が起こっているのか本当に気にしない場合にのみ、これを起こさせてください。

38
Yishai

これは、メソッドパラメータのためだけに個別の変数名を作成する必要がないセッターに役立ちます。例:

public void setX(int x) {
    this.x = x;
}

それとは別に、私はそれらを避けたいと思います。

15
Tom Jefferys

1つの主要な目的は、人々を混乱させることです。これは悪い習慣であり、避けるべきです。

11
Robert Munteanu

シャドウイングは実際にはJavaのみの用語ではありません。スコープで宣言された変数が、より大きなスコープの変数と同じ名前である場合、その変数はシャドウイングされます。

シャドウイングの一般的な使用法は、内部クラスと外部クラスがあり、同じ名前の変数を維持したい場合です。

ただし、回避できる場合は、混乱を招く可能性があるため、回避する必要があります。

5
z -

2つの一般的な使用法は、コンストラクターとsetメソッドです。

public Foo(int x) {
    this.x = x;
}

public void setX(int x) {
    this.x = x;
}

非常にまれに、変数のコピーが1つの瞬間に必要な場合に役立ちますが、変数はメソッド呼び出し内で変更される可能性があります。

private void fire() {
    Listener[] listeners = this.listeners;
    int num = listeners.length;
    for (int ct=0; ct<num; ++ct) {
        listeners[ct].stateChanged();
    }
}

(もちろん、不自然な例では、posh forループでは不要になりました。)