该关键字在Java中的其他用法
对于那些阅读我上一个问题的人来说,这是同一位老师和同一个项目 我的老师“检查”了我的web应用程序项目代码,并提供了一些建议。其中一项建议是,即使在这种情况下,也要使用this关键字:该关键字在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
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:时间已经接近了;他们可能在几乎相同的时间做了相同的回答
这就是发生的事情:在发布之前,应该有一个通知,比如在编辑时添加了新的响应。我在一些论坛上看到过。很多人认为这是一个不好的实践。