0

(对于阅读我上一个问题的人来说,这是同一个老师和同一个项目。)

我的老师“检查”了我的 Web 应用程序项目代码并提供了一些建议。建议之一是即使在这种情况下也使用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 中使用 for 方法链接。在这个设计模式中,所有方法都返回这个,不管它们做什么,允许你这样的东西:

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

使用构造的 API,因此:

public Dog setColor(String c) {
    color=c;
    return this;
    }
于 2009-10-14T17:12:24.420 回答
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 回答
1

此外,您可以return this链接方法调用 - 例如在 Builder 模式中。

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 回答
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关键字也会触发编译器的警告。如果你不使用,编译器会像一切都很酷一样玩。并且更改为很可能是一个错误。所以你可能想要这个警告。如果它不是错误,您应该更改用于将其视为静态的代码,以避免将来代码中的错误/误解。这样,如果有人出现并将其更改回来,您将收到新的警告。usernamestaticthisusernamestaticusername

因此,如果没有别的,在 getter 的上下文中,它还可以在其他事情发生变化时触发编译器警告。这是一件好事。

于 2009-10-14T19:52:58.013 回答