0

(私の前の質問を読んだ方へ、これは同じ先生で同じプロジェクトです。)

私の先生は、Web アプリケーション プロジェクトの私のコードを「検査」し、いくつかの提案をしてくれました。提案の 1 つは、thisこの状況でもキーワードを使用することでした。

private String getUsername() {
    return username;
}

したがって、彼のアドバイスに従うと、次のようになります。

private String getUsername() {
    return this.username;
}

その理由を尋ねると、あいまいさを解消する以外にも this キーワードには別の使い方があるとのことでした。this キーワードの別の使用法については、簡単なグーグル検索では結果が返されませんでした。Sunの Java チュートリアルでさえ、この状況に適合する他の使用方法について言及していません。

4

8 に答える 8

8

thisまた、ネストされたクラス内から周囲のクラス インスタンスとそのメンバーにアクセスすることもできます。

public class OuterClass
{
    private class InnerClass
    {
        public OuterClass getOuter()
        {
            return OuterClass.this;
        }
    }
}
于 2009-10-14T16:57:20.073 に答える
3

コンストラクターをチェーンするためにも使用します。

public class Foo
{
    private final String name;

    public Foo()
    {
        this("Fred");
    }

    public Foo(string name)
    {
        this.name = name;
    }
}

(スーパークラスコンストラクターへのチェーンには、を使用しますsuper(...)。)

さらに、内部クラスからそれを使用して、どのメンバーを探しているのかを正確に指定できるという奇妙な場合があります。幸い、正確な構文は覚えていません。頻繁に使用する必要はありません。

于 2009-10-14T16:54:06.103 に答える
2

言及されていない非常に重要なものは、流れるようthisな API で使用されるメソッド チェーンの使用です。この設計パターンでは、すべてのメソッドが何をするかに関係なくこれを返すため、次のようなことができます。

dog.setColor("black").setSize("tall").makeDangerous().bark();

構築された API を使用するため、次のようになります。

public Dog setColor(String c) {
    color=c;
    return this;
    }
于 2009-10-14T17:12:24.420 に答える
1

また、メソッド呼び出しをチェーンすることもできreturn thisます-たとえば、ビルダーパターンで。

class CustomerBuilder
{
    private String firstName = "Default";
    private String lastName = "Default";

    public CustomerBuilder setFirstName(String firstName)
    {
        this.firstName = firstName;
        return this;
    }

    public CustomerBuilder setLastName(String lastName)
    {
        this. lastName = lastName;
        return this;
    }

    public Customer build()
    {
        /* ... do some actions to build a Customer object ... */
    }
}

次に、このビルダーを次のように使用できます。

Customer customer = new CustomerBuilder().setFirstName("John").setLastName("Smith").build();
于 2009-10-14T17:16:00.660 に答える
1

thisキーワードをクラス フィールドに常に使用することをお勧めする人もいます。これは、次の状況で役立ちます。

class MyClass {
    private int x = 0;

    public void DoSomething(int x) {
        int privateFieldValue = this.x; // use field of our class
    }
}
于 2009-10-14T16:56:30.340 に答える
1

を使用してメンバー変数に常にアクセスすることthis.は、いくつかの場所でのコーディング規則です。アイデアはおそらく、命名規則 (「すべてのフィールド名はアンダースコアで開始する必要があります_」) に似ていますが、醜い名前マングリングはありません。this.(他の場所では、まったく逆の慣習があります。絶対に必要な場合を除いて避けてください)。

個人的には、コードにアクセスするために使用するすべてのツールは、各変数/フィールドを色分け/スタイルコード化して区別できるはずなので、それを行う本当の理由はわかりません。

おじいちゃんのテキスト エディターは、ローカル変数とフィールドへのアクセスの違いを示すことができません。しかし、それはコード内で冗長にハードコーディングする正当な理由ではありません。

于 2009-10-14T16:58:42.013 に答える
0

同じクラスの別のコンストラクターを呼び出すことを除いて、「this」の他の使用法はありません。

一部の開発者は、メンバー変数へのアクセスを限定すること(必要がない場合でも)をベストプラクティスと見なしています(私はそうしません)。重要な点は、その行を変更せずに割り当てのセマンティクスを変更できることです。

class Foo {

  String foo;

  void foo() {
    // a lot of code
    foo = "something"
  }

}

次の手順を実行するだけで変更できます。

  void foo() {
    String foo;
    // a lot of code
    foo = "something"
  }

つまり、冗長性を犠牲にして、主にメンテナンスと読みやすさについてです。

于 2009-10-14T16:51:20.337 に答える
0

キーワードを使用するthisと、誰かがやって来てusernameメンバーをstatic変数に変更することを決定した場合、コンパイラからの警告もトリガーされます。を使用しない場合this、コンパイラはすべてがクールであるかのように動作します。usernameに変更すると、バグになる可能static性が非常に高くなります。したがって、おそらく警告が必要です。また、それがバグでない場合は、usernameそれを静的であるかのように扱うために使用するコードを変更して、コードの将来のバグ/誤解を避ける必要があります。そうすれば、誰かがやって来て元に戻した場合、新しい警告が表示されます。

したがって、ゲッターのコンテキストでは、他に何もない場合でも、他のことが変更されたときにコンパイラの警告をトリガーすることもできます。そして、それは良いことです。

于 2009-10-14T19:52:58.013 に答える