Java - 何时使用'this'关键字

时间:2010-03-11 22:11:17

标签: java coding-style this

在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();

显然代码很少,但它说明了我的例子。在这些情况下,这仅仅取决于个人偏好吗?

12 个答案:

答案 0 :(得分:73)

  

但是,如果我将构造函数中的语句更改为

,Java就足以知道发生了什么
  bar = bar;

FALSE!它会编译,但它没有按照你的想法做到!

至于何时使用它,很多是个人喜好。我喜欢在我的公共方法中使用this,即使它是不必要的,因为这是接口发生的地方,并且很好地断言我的是什么,什么不是。

作为参考,您可以查看有关this.subject的Oracle Java教程; - )

http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

答案 1 :(得分:13)

如果参数的名称与字段相同,则应使用它,否则会遇到问题。它会编译,但不一定会按你的要求进行编译。

至于其他地方,除非为了可读性而需要,否则不要使用它。如果你到处使用它,你的代码中有20%将包含“this”这个词!

答案 2 :(得分:11)

实际上

baz = baz

会提出此警告

  

对变量baz的赋值没有   效果

所以您认为错误,本地范围会覆盖class属性,因此您必须明确地使用this关键字将变量分配给class属性。

否则,赋值为赋值的变量只是作为参数传递的变量,而忽略了第一类。这就是this有用的原因,它不是可读性的事实,而是明确决定你在谈论哪个baz的事实。

我会说

  

在不使用它的情况下使用this会导致含糊不清(或编译器警告,这更重要),否则就离开它。因为当默认假设(首先检查本地,然后检查类属性)是不够的时候,它的目的正是为了解决歧义。

答案 3 :(得分:10)

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()调用Xyz()需要Abc类的对象..所以我们可以传递this而不是新的Abc(),因为如果我们传递新的Abc() {1}}它会一次又一次地召唤自己。

我们还使用它来区分方法的类变量和局部变量。 e.g

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}

这里this.a是指类Abc的变量a。因此具有与使用新Abc().a;相同的效果。

所以你可以说this指的是当前类的对象。

答案 4 :(得分:7)

显式构造函数调用 中使用关键字是很常见的。您可以查看documentation中的示例。

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;
    }
    ...
}

答案 5 :(得分:6)

public Foo(Bar bar) {
     this.bar = bar;
}

不同
public Foo(Bar bar) {
     bar = bar;
}

在第二种情况下,范围中的条是参数,因此您将其分配给自身。 this.bar仍为null

答案 6 :(得分:3)

这是个人偏好 - 选择一种风格并坚持下去。我个人使用this但其他人认为这是多余的。

答案 7 :(得分:3)

根据惯例,您可以将其用于可读性。它强调它是一个对象变量这一事实。

我也喜欢使用与变量同名的setter参数(在方法签名中看起来更好)。在这种情况下,您需要this

答案 8 :(得分:2)

我总是尝试在本地类对象上使用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;
    }
  }
}

答案 9 :(得分:2)

void set(int real)
{
    this.real = real;
}

此处this是当实例变量与局部变量相同时使用的关键字 this的另一个用途是构造函数重载。它可以在重载的构造函数中调用构造函数。

答案 10 :(得分:1)

个人偏好,但我用它来解决歧义,我想在很少见的情况下明确指出变量是一个字段。有些项目人们在每个字段引用上都使用“this.field”。我发现这种做法在视觉上让人分心,令人讨厌,但你应该准备好偶尔看一下这样的代码。

我秘密地认为在地狱中有一个特殊的地方,那些写500个线路类的人在其中有275个“这个”关键字,但是这种风格在一些开源项目中找到,所以我猜他自己。

答案 11 :(得分:0)

用它来克隆对象(通过将自身的引用传递给复制构造函数)。

对于继承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.
  }
}