[英]Java - when to use 'this' keyword [duplicate]
这个问题在这里已有答案:
在Java中使用this
关键字的最佳做法是什么? 例如,我有以下类:
class Foo {
Bar bar;
public Foo(Bar bar) {
this.bar = bar;
}
}
这很好,但是如果我将构造函数中的语句更改为,Java就足够聪明地知道发生了什么
bar = bar;
那么为什么要使用this
关键字? (我知道在某些情况下,使用它是完全必要的,我只是要求这样的情况)。 实际上,我倾向于纯粹为了可读性而使用关键字,但通常的做法是什么? 例如,在整个商店中使用它会使我的代码看起来有些混乱
boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();
显然是一个糟糕的代码,但它说明了我的例子。 在这些情况下,这仅仅取决于个人偏好吗?
但是,如果我将构造函数中的语句更改为,Java非常聪明,可以知道发生了什么
bar = bar;
假! 它编译但它没有做你认为它做的!
至于何时使用它,很多是个人喜好。 我喜欢在我的公共方法中使用this
,即使它是不必要的,因为这是接口发生的地方,并且断言什么是我的和什么不是很好。
作为参考,您可以查看关于this.subject的Oracle Java教程;-)
http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
当你有一个与字段同名的参数时,你应该使用它,否则你会遇到问题。 它会编译,但不一定会按你的意愿行事。
至于其他地方,除非为了可读性而需要它,否则不要使用它。 如果你到处使用它,你的代码中有20%将包含'this'这个词!
其实
baz = baz
会提出这个警告
对变量baz的赋值无效
所以您认为错误,本地范围会覆盖class属性,因此您必须明确地使用this
关键字将变量分配给class属性。
否则,赋值为赋值的变量只是作为参数传递的变量,而忽略了第一类。 这就是为什么this
很有用,这不是一个可读性的事实,这是明确决定你在谈论哪个baz
的事实。
我会说
使用
this
地方不使用它会引起歧义(或编译器警告,这是更重要的),否则见好就收吧。 因为它的目的正是在默认假设(首先检查本地,然后检查类属性)是不够的时候解决歧义。
this
关键字指的是调用某些方法的类的Object。
例如:
public class Xyz {
public Xyz(Abc ob)
{
ob.show();
}
}
public class Abc {
int a = 10;
public Abc()
{
new Xyz(this);
}
public void show()
{
System.out.println("Value of a " + a);
}
public static void main(String s[])
{
new Abc();
}
}
在Abc()
我们调用需要Object of Abc Class的Xyz()
。所以我们可以传递this
而不是新的Abc()
,因为如果我们在这里传递新的Abc()
,它会一次又一次地调用它自己。
我们还使用它来区分方法的类变量和局部变量。 例如
class Abc {
int a;
void setValue(int a)
{
this.a = a;
}
}
这里this.a
是指类Abc的变量a。 因此具有与使用新Abc().a;
相同的效果Abc().a;
。
所以你可以说this
是指当前类的对象。
在显式构造函数调用中使用此关键字很常见。 您可以从文档中看到一个示例。
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
public Foo(Bar bar) {
this.bar = bar;
}
是不一样的
public Foo(Bar bar) {
bar = bar;
}
在第二种情况下,范围中的条是参数,因此您将其分配给自身。 this.bar
保持为null
。
这是个人喜好 - 选择一种风格并坚持下去。 我个人使用this
但其他人认为这是多余的。
根据惯例,您可以将其用于可读性。 它强调它是一个对象变量的事实。
我也喜欢使用与变量同名的setter参数(在方法签名中看起来更好)。 在这种情况下你需要this
。
我总是尝试在本地类对象上使用this
关键字。
我用它来直观地提醒我对象是静态对象还是类对象。
它帮助我和编译器区分方法args和本地类对象。
public void setValue(int value){
this.value = value;
}
它帮助我在视觉上提醒我内部/嵌套/匿名类中是否存在这样的本地对象,以区别于封装类对象。 因为如果没有this
前缀,我的约定会提醒我它是封装类的一个对象
public class Hello{
public int value = 0;
public boolean modal = false;
public class Hellee{
public int value = 1;
public getValue(){
if (modal)
return 0;
return this.value;
}
}
}
void set(int real)
{
this.real = real;
}
this
是当实例变量与局部变量相同时使用的关键字。
另一个使用this
是构造函数重载。 它可以在重载的构造函数中调用构造函数。
个人偏好,但我用它来解决歧义,我想在非常罕见的情况下,明确指出变量是一个字段。 有些项目人们在每个字段引用上都使用“this.field”。 我发现这种做法在视觉上让人分心,令人讨厌,但你应该准备好偶尔看一下这样的代码。
我秘密地认为在地狱中有一个特殊的地方,那些写了500行的关键字,其中有275个'这个'关键字,但这种风格在一些开源项目中找到,所以我猜他自己。
用它来克隆对象(通过将自身的引用传递给复制构造函数)。
对于继承Cloneable
对象很有用。
public Foo implements Cloneable {
private String bar;
public Foo(Foo who) {
bar = who.bar;
}
public Object getClone() {
return new Foo(this); //Return new copy of self.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.