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

jac*_*bot 68 java coding-style this

this在Java中使用关键字的最佳做法是什么?例如,我有以下类:

class Foo {
    Bar bar;

    public Foo(Bar bar) {
         this.bar = bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好,但是如果我将构造函数中的语句更改为,Java就足够聪明地知道发生了什么

 bar = bar;
Run Code Online (Sandbox Code Playgroud)

那么为什么要使用this关键字?(我知道在某些情况下,使用它是完全必要的,我只是要求这样的情况).实际上,我倾向于纯粹为了可读性而使用关键字,但通常的做法是什么?例如,在整个商店中使用它会使我的代码看起来有些混乱

boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();
Run Code Online (Sandbox Code Playgroud)

显然是一个糟糕的代码,但它说明了我的例子.在这些情况下,这仅仅取决于个人偏好吗?

pol*_*nts 76

但是,如果我将构造函数中的语句更改为,Java非常聪明,可以知道发生了什么

  bar = bar;
Run Code Online (Sandbox Code Playgroud)

假!它编译但它没有做你认为它做的!

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

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

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

  • 这就是为什么我喜欢将所有参数变量标记为final. (13认同)

Dón*_*yle 14

当你有一个与字段同名的参数时,你应该使用它,否则你会遇到问题.它会编译,但不一定会按你的意愿行事.

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

  • 精彩的答案,简短,简洁,切中要点 (3认同)
  • 尽管到处都是明确的“this”关键字可能会有所帮助是有争议的。像 Python 和 Rust 这样的语言实际上需要它(`self`),我从来没有把这种明确性看作是消极的。 (2认同)

Jac*_*ack 11

其实

baz = baz
Run Code Online (Sandbox Code Playgroud)

会提出这个警告

对变量baz的赋值无效

所以你认为错误,本地范围覆盖了class属性,所以你必须使用this关键字explictly将变量赋值给class属性.

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

我会说

使用this的地方不使用会引起歧义(或编译器警告,这是更重要的),否则见好就收吧.因为它的目的正是在默认假设(首先检查本地,然后检查类属性)是不够的时候解决歧义.


use*_*977 10

thiskeyword是指调用某些方法的类的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里Abc()我们正在调用Xyz()哪个需要Abc类的对象..所以我们可以传递this而不是新的Abc(),因为如果我们Abc()在这里传递新的它会一次又一次地调用自己.

我们还使用它来区分方法的类变量和局部变量.例如

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

显式构造函数调用中使用关键字很常见.您可以从文档中看到一个示例.

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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*oko 6

public Foo(Bar bar) {
     this.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

是不一样的

public Foo(Bar bar) {
     bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

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