Java中this关键字的其他用法

时间:2009-10-14 16:48:29

标签: java this javabeans keyword

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

我的老师'检查了'我的网络应用项目代码并提供了一些建议。其中一个建议是在这种情况下使用this关键字:

private String getUsername() {
    return username;
}

因此,如果我遵循他的建议,那就会变成:

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

我问他为什么,他告诉我除了清除歧义之外,还有另一种用法。快速的Google搜索没有返回此关键字的其他用法的结果。即使是Java tutorial from Sun也没有提到适合这种情况的其他用法。

8 个答案:

答案 0 :(得分:8)

this还允许您从嵌套类中访问周围的类实例及其成员,例如。

public class OuterClass
{
    private class InnerClass
    {
        public OuterClass getOuter()
        {
            return OuterClass.this;
        }
    }
}

答案 1 :(得分:3)

您也可以使用它链接构造函数:

public class Foo
{
    private final String name;

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

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

(对于链接到超类构造函数,请使用super(...)。)

此外,还有一些奇怪的时刻,您可以从内部类中使用它来准确指定您所追求的成员。我不记得确切的语法,幸运的是 - 我不需要经常使用它。

答案 2 :(得分:2)

一个非常重要的未提及的是使用this进行流畅API中使用的方法链接。在这种设计模式中,所有方法都会返回,无论它们做什么,都可以使用以下内容:

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

使用构造的API,所以:

public Dog setColor(String c) {
    color=c;
    return this;
    }

答案 3 :(得分:1)

有些人认为始终对类字段使用关键字this是一种好习惯。这在以下情况下非常有用:

class MyClass {
    private int x = 0;

    public void DoSomething(int x) {
        int privateFieldValue = this.x; // use field of our class
    }
}

答案 4 :(得分:1)

在某些地方,始终使用this.访问成员变量是一种编码约定。这个想法可能与命名约定类似(“所有字段名称必须以下划线_开头”)但没有丑陋的名称 - 错误。 (其他地方完全相反:避免this.,除非绝对必要)。

我个人认为没有任何真正的理由这样做,因为您用来访问代码的所有工具都应该能够对每个变量/字段进行颜色/样式编码以进行区分。

您的爷爷文本编辑器无法显示访问本地变量和字段之间的区别。但这并不是在代码中对其进行冗余编码的好理由。

答案 5 :(得分: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();

答案 6 :(得分:0)

除了调用同一个类的另一个构造函数之外,没有其他用法'this'。

成员变量的合格访问 - 即使不需要 - 被一些开发人员认为是最佳实践(我没有)。重点是可以在不改变该行的情况下更改赋值的语义:

class Foo {

  String foo;

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

}

只需执行以下操作即可更改:

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

所以它主要是关于维护和可读性 - 以冗长的价格为准。

答案 7 :(得分:0)

如果有人出现并决定将this成员更改为username变量,则使用static关键字也会触发编译器发出警告。如果你不使用this,编译器就会像一切都很酷。并且username更改为static很可能是一个错误。所以你可能想要警告。如果它不是错误,您应该更改使用username的代码将其视为静态,以避免代码中的未来错误/误解。这样,如果有人出现并将其更改返回,您将收到新的警告。

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