【问题标题】:Is it bad practice to use `this` in Java? [closed]在 Java 中使用 `this` 是不好的做法吗? [关闭]
【发布时间】:2011-10-18 03:16:00
【问题描述】:

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

【问题讨论】:

  • 你能举个例子,没有this你就活不下去吗?
  • 使用this 是一个好习惯,但不确定android。可能与键值编码有关。
  • 我想我可以没有它,但就个人而言,我发现它更容易使用。它对我来说更明确,因此更清晰。
  • @Gleno 在内部类中访问外部类中的私有内容时需要使用“this”。
  • 在任何可能的地方使用this. 是一种不好的做法。显式总是比隐式好。它也是方法代码块中的一种自然作用域机制,永远不要怀疑该变量来自哪里。 super. 也是一个应该经常使用的东西。

标签: java this


【解决方案1】:

主要是风格上的差异。我还没有看到关于它为什么好或坏的争论。我个人喜欢使用它,并且在某些情况下您需要使用它。

例如,如果您有一个匿名内部类想要调用父类的方法,您需要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。这些是最先想到的。

【讨论】:

  • 只有当你想访问当前实例的某个部分被本地范围内的其他东西隐藏时才需要使用它。您的内部类不需要它,因为 OnClickListener 没有 doSomething() 隐藏 MyClass#doSomething()。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    是什么让你认为是这样的?例如。 SDK coding style guide 没有提到这一点,我已经看到它在不同的地方被使用。然而,遵循变量的命名准则,它通常不是必需的,可以省略,这通常是这种情况。

    虽然使用 this 关键字引用实例时为了清楚起见,但正如文档所述,没有真正强制执行的样式,并且遵循命名规则使其没有必要。

    例如一个完全有效的 setter 在有和没有这个的命名之后可以是

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

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

    【讨论】:

    • 我只是假设他们不喜欢this,因为我看到的大多数示例代码和文档都没有使用它。这让我更难阅读文档,因为他们会提到一个方法,比如 startService (),而我不知道包含 startService () 的类。
    • 对于方法调用它是不同的。如果没有适当的限定符,它会自动成为 this.something() 并且通常在 Java 中很少使用。我不会使用它。
    • “我只是假设...” - 共识是你假设错了。
    【解决方案4】:

    与其说是坏习惯,不如说是个人品味。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        使用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 是第三方类时),为了获得可预测的行为,您应该始终限定这样的引用。除非变量行为正是你想要的。

        【讨论】:

          猜你喜欢
          • 2016-08-18
          • 1970-01-01
          • 2023-04-10
          • 2015-01-22
          • 2020-07-26
          • 2019-05-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          相关资源
          最近更新 更多