该关键字在Java中的其他用法

该关键字在Java中的其他用法,java,this,javabeans,keyword,Java,This,Javabeans,Keyword,对于那些阅读我上一个问题的人来说,这是同一位老师和同一个项目 我的老师“检查”了我的web应用程序项目代码,并提供了一些建议。其中一项建议是,即使在这种情况下,也要使用this关键字: private String getUsername() { return username; } class MyClass { private int x = 0; public void DoSomething(int x) { int privateFieldV

对于那些阅读我上一个问题的人来说,这是同一位老师和同一个项目

我的老师“检查”了我的web应用程序项目代码,并提供了一些建议。其中一项建议是,即使在这种情况下,也要使用this关键字:

private String getUsername() {
    return username;
}
class MyClass {
    private int x = 0;

    public void DoSomething(int x) {
        int privateFieldValue = this.x; // use field of our class
    }
}
因此,如果我听从他的建议,那将是:

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

我问他为什么,他告诉我这个关键字还有另外一个用法,除了用来消除歧义。快速的谷歌搜索并没有为这个关键字的另一个用法返回任何结果。甚至提到的“this”也没有适合这种情况的其他用法。

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

限定对成员变量的访问——即使不需要——被一些我不知道的开发人员认为是最佳实践。要点是,可以在不更改该行的情况下更改赋值的语义:

class Foo {

  String foo;

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

}
可以通过简单地执行以下操作进行更改:

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

因此,它主要是关于维护和可读性的——以冗长为代价。

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

public class Foo
{
    private final String name;

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

    public Foo(string name)
    {
        this.name = name;
    }
}
要链接到超类构造函数,请使用super


此外,在某些奇怪的情况下,您可以从内部类使用它来指定您要查找的成员。幸运的是,我不记得确切的语法了——我不需要经常使用它。

有些人认为总是在类字段中使用关键字this是一种很好的做法。这在以下情况下非常有用:

private String getUsername() {
    return username;
}
class MyClass {
    private int x = 0;

    public void DoSomething(int x) {
        int privateFieldValue = this.x; // use field of our class
    }
}
这还允许您从嵌套类中访问周围的类实例及其成员,例如

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

始终使用此函数访问成员变量。在某些地方是一种编码惯例。其想法可能是,它类似于命名约定,所有字段名都必须以下划线开头,但不能有难看的名称混乱。其他地方则有完全相反的惯例:避免这种情况。除非绝对必要

就我个人而言,我看不出有什么真正的理由这样做,因为您用来访问代码的所有工具都应该能够对每个变量/字段进行颜色/样式编码,以进行区分


您的grand dads文本编辑器无法显示访问局部变量和字段之间的差异。但这并不是在代码中对其进行冗余硬编码的好理由。

一个没有提到的非常重要的原因是在fluent API中使用此方法链接。在这种设计模式中,所有方法都会返回此值,不管它们做什么,允许您执行以下操作:

dog.setColor("black").setSize("tall").makeDangerous().bark();
使用构造的API,因此:

public Dog setColor(String c) {
    color=c;
    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();
如果有人出现并决定将用户名成员更改为您的静态变量,使用this关键字还将触发编译器发出的警告。如果您不使用此选项,编译器将像一切都很酷一样继续运行。用户名变为静态很可能是一个bug。所以你可能想要警告。如果不是bug,您应该更改使用username的代码,将其视为静态的,以避免将来代码中出现bug/误解。那样的话,如果有人过来把它改回来,你会得到一个新的警告


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

是的,我也知道这一点。但是,在给定的示例getter方法中,我的老师还可以告诉我什么其他用法呢?你对老师所说的措辞没有提到它是getter方法中的另一个用法。他到底说了什么?就我个人而言,我不会像你的老师建议的那样重复使用这个词——我认为它不会增加可读性。他说我应该在getter方法中使用this关键字。@Ramon:是的,但这与他说其他用法在getter方法中不同。这是我在回答中考虑的用法。我记不起来了,但我不确定是否应该感谢你提醒我。哎哟。我讨厌内部类语法。这是问题已经提到的消除歧义的用法。我同意在字段和参数之间使用“this”消除歧义是有用的,但我不认为在没有歧义的情况下始终使用“this”是有意义的。其他人能否就这种行为是否为“良好做法”发表意见?Java和C程序员之间的共识不同吗?顺便说一句,我是Java,我更喜欢在整个方法中使用“this”,或者根本不使用。我通常不会声明与字段同名的局部变量,除非它是构造函数或setter的参数,在构造函数或setter中,它将被分配给具有相同名称和类型的字段。@finnw:时间已经接近了;他们可能在几乎相同的时间做了相同的回答
这就是发生的事情:在发布之前,应该有一个通知,比如在编辑时添加了新的响应。我在一些论坛上看到过。很多人认为这是一个不好的实践。