[英]In OOP, what is the best practice in regards to using “this” inside a class?
我一直想知道的事情; 在一个类中,你可以通过使用'this。[NAME]'或简单地[NAME]来引用一个成员,这是首选?
例如在Java中:
public class foo {
public int bars = 0;
private void incrementBars(){
bars++;
}
}
和
public class foo {
public int bars = 0;
private void incrementBars(){
this.bars++;
}
}
“似乎”具有相同的效果。
在我实例化类foo的多个实例的情况下,到目前为止,我做了类似的事情:
for (foo f : listOfFoos){
f.incrementBars();
}
它似乎仍然有效。
它在技术上是不明确的,如果是这样,有一种首选方式吗?
在variable shadowing
的情况下使用this
。
class MyClass{
int i;//1
public void myMethod(){
i = 10;//referring to 1
}
public void myMethod(int i){//2
i = 10;//referring to 2
this.i = 10 //refering to 1
}
}
还有一段时间,由于我们的英语思维方式, this
将使代码更具可读性
没有歧义。 如果有,你必须使用this
。
有些人为了清晰起见推荐this
其他人建议在不需要时反对它,因为它引入了“噪音”。 为清晰起见,一些现代IDE或编辑器可能能够使用语法突出显示以不同于字段的颜色(例如)参数。
我个人可以避免this
,并使用@ unholysampler的下划线约定 。 与您的同事达成协议并将其纳入您的编码标准。
您可以使用this
来确保和沟通您正在处理的字段 。
它允许你写一个类似的setter
public void setX(int x) {
this.x = x;
}
这非常简单。
你唯一需要的时间this.
是当前范围还有一个同名变量。 我更喜欢对所有类变量使用_variable
的约定。 这样我就不必使用this.
并且从不会意外地触摸类变量,认为它是一个本地范围的变量。
class Test
{
private int value;
public Test(int value)
{
// This is wrong
// value = value
// This is right
this.value = value;
}
}
当它们被局部变量隐藏时,使用“this”来访问成员变量。 因为“this”只是对当前对象的引用,所以你可以这样做:
doSomething(this);
这些基本上是您需要使用它的唯一方法。
它在技术上是模棱两可的,除非你有可变阴影(Jigar在他的回答中指出)。
大多数情况下,如果您在编辑器/ IDE中工作,并且非常了解您的类结构语法,则突出显示将明确变量是对象中的字段还是仅仅是方法中定义的变量。 但是,在更纯粹的文本编辑器(例如vim)中,语法突出显示并未明确这一点。
话虽如此,我更喜欢使用this.field来引用属于该对象的所有字段,只因为我知道我不时会在正常的IDE之外读取代码。 它略显冗长,但这是我不介意的权衡。
在你的问题中,前两个样本具有完全相同的东西。 唯一的,其中this
是强制性的是当一个属性是由一个局部变量阴影:
public class Test {
private int a;
public void noShadow() {
System.out.println(a); // attribute
}
public void shadow(int a) {
System.out.println(a); // parameter
System.out.println(this.a); // attribute
}
}
现在我认为没有绝对的最佳实践,特别是现代IDE提供高级语法高亮。 有些人喜欢在属性前加上_
, m_
等等,而不是使用this
。 有些人更喜欢使用this
强制性,不要在属性上添加任何命名规则。 您要做的很大程度上取决于现有代码或现有编码标准。 我什么都不存在确保编码标准对于所有从事该项目的人来说都是一样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.