在Java中使用`this`是不好的做法吗?

时间:2011-10-18 03:16:00

标签: java this

我只是对使用this感到好奇,因为Android的示例代码和文档没有使用this关键字(我喜欢相信android工程师一般聪明,因此我用它们作为基础)。我只是对Android工程师没有多少使用this的根本原因感到好奇。

6 个答案:

答案 0 :(得分:7)

它主要是风格上的差异。我还没有看到为什么它的好坏。我个人喜欢使用它,当你需要使用它时会有一些例子。

例如,如果您有一个想要调用父类方法的Anonymous Inner类,则需要this。例如:

class MyClass{
    protected void doSomething(){

    }

    OnClickListener n = new OnClickListener(){
        public void onClick(View v){
            MyClass.this.doSomething();
        }
    };

}

使用this的另一个原因是方法参数掩盖了成员变量。在这种情况下,你可以使用this来区分这两者,虽然我建议你将参数重命名为非掩盖的东西。

class MyClass{
    protected int val;

    public void setVal(int val){
        this.val = val; // set the member variable equal to the method argument
    }

}

使用this的另一个原因是从该实例中传递指向当前类实例的指针。例如,当您创建新的Intent

Intent i = new Intent(this, NewActivity.class);

您可能需要更多地方使用this。这是我想到的最初几个。

答案 1 :(得分:1)

没关系,但如果您在代码中使用“this”,请确保在任何地方都使用它。这使您的代码清晰。

答案 2 :(得分:1)

是什么让你认为是这样的?例如。 SDK coding style guide没有提到这一点,我看到它被用于各个地方。但是,遵循变量的命名准则通常是没有必要的,可以省略,这通常就是这种情况。

当引用使用this关键字的实例时,为了清晰起见,但是正如文档中提到的那样,没有真正强制执行的样式,并且遵循命名规则使得它不是必需的。

e.g。在有和没有这个命名的命名后,一个完全有效的setter可能是

 private int mCounter;
   public void setCounter(int counter) {
      mCounter = counter
   }

 private int increment;
 public void setIncrement(int increment) {
     this.increment = increment
 }

请注意,在第一个例子中你可以,但不必使用它。在第二个你必须和第一个它可能更接近风格指南..

答案 3 :(得分:0)

这比个人做法更有个人品味。

答案 4 :(得分:0)

不,不是,在Android的示例代码中有对'this'的引用,但是没有理由认为它是一种不好的做法。很多时候它是不必要的,为简洁起见可能省略了它。

例如,从它定义的类中调用methodA()可以调用this.methodA()。在这种情况下这是不必要的,因为这是在你打电话时隐含的。它通常用于setter,其中参数名称与您正在设置的变量名称相同。

public void setName(String name) {
   this.name = name;
}

答案 5 :(得分:0)

使用this更像是一种安全措施:

class MyClass{
    void doSomething() { 
    }

    OnClickListener n = new OnClickListener() {
        void doSomething() {
        }

        public void onClick(View v){
            MyClass.this.doSomething(); // MyClass#doSomething()
            this.doSomething(); // OnClickListener#doSomething()

            doSomething(); // OnClickListener#doSomething() if present,
                           // MyClass#doSomething() otherwise - danger!
        }
    }; 
}

由于有些情况下您无法控制成员或方法的存在(例如,当OnClickListener是第三方类时),为了获得可预测的行为,您应该总是限定此类引用。除非变量行为正是你想要的。