(对于那些阅读我之前的问题的人来说,这是同一个老师和同一个项目。)
我的老师'检查了'我的网络应用项目代码并提供了一些建议。其中一个建议是在这种情况下使用this
关键字:
private String getUsername() {
return username;
}
因此,如果我遵循他的建议,那就会变成:
private String getUsername() {
return this.username;
}
我问他为什么,他告诉我除了清除歧义之外,还有另一种用法。快速的Google搜索没有返回此关键字的其他用法的结果。即使是Java tutorial from Sun也没有提到适合这种情况的其他用法。
答案 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的上下文中,当其他事情发生变化时,它也会触发编译器警告。这是一件好事。