私は自分の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);
}
}
シャドウイングの基本的な目的は、ローカルコードを周囲のクラスから切り離すことです。利用できなかった場合は、次のケースを検討してください。
APIのClassFooがリリースされました。コードではそれをサブクラス化し、サブクラスではbarと呼ばれる変数を使用します。次に、Fooは更新をリリースし、Barと呼ばれる保護された変数をそのクラスに追加します。
これで、予期していなかった競合のためにクラスが実行されなくなります。
ただし、意図的にこれを行わないでください。スコープ外で何が起こっているのか本当に気にしない場合にのみ、これを起こさせてください。
これは、メソッドパラメータのためだけに個別の変数名を作成する必要がないセッターに役立ちます。例:
public void setX(int x) {
this.x = x;
}
それとは別に、私はそれらを避けたいと思います。
1つの主要な目的は、人々を混乱させることです。これは悪い習慣であり、避けるべきです。
シャドウイングは実際にはJavaのみの用語ではありません。スコープで宣言された変数が、より大きなスコープの変数と同じ名前である場合、その変数はシャドウイングされます。
シャドウイングの一般的な使用法は、内部クラスと外部クラスがあり、同じ名前の変数を維持したい場合です。
ただし、回避できる場合は、混乱を招く可能性があるため、回避する必要があります。
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ループでは不要になりました。)