26

Deitel の Java How to Program 本を読んでいて、 shadowing という用語に出くわしまし。シャドーイングが許可されている場合、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);
    }
}
4

5 に答える 5

41

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

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

予期できなかった競合のため、クラスは実行されません。

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

于 2009-07-07T12:56:01.070 に答える
16

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

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

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

于 2009-07-07T12:45:52.930 に答える
10

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

于 2009-07-07T12:44:50.777 に答える
5

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

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

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

于 2009-07-07T12:47:14.117 に答える
3

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ループでは不自然な例が不要になりました。)

于 2009-07-07T13:02:14.530 に答える