【问题标题】:In OOP, what is the best practice in regards to using "this" inside a class?在 OOP 中,在类中使用“this”的最佳实践是什么?
【发布时间】:2011-01-09 19:17:59
【问题描述】:

我一直想知道的事情;在一个类中,您可以使用“this.[NAME]”或直接使用 [NAME] 来引用成员,这是首选?

例如在 Java 中:

public class foo {
    public int bars = 0;
    private void incrementBars(){
        bars++;
    }
}   

public class foo {
    public int bars = 0;
    private void incrementBars(){
        this.bars++;
    }
}

“似乎”有同样的效果。

如果我实例化类 foo 的多个实例,到目前为止,我会执行以下操作:

for (foo f : listOfFoos){
    f.incrementBars();
}

它似乎仍然有效。

它在技术上是否模棱两可,如果是,是否有首选方法?

【问题讨论】:

  • 请注意,这两种方法不仅似乎具有相同的效果——实际上它们确实如此。 this. 是在访问实例成员时隐含的,编译后的字节码对于任何一种语法都是相同的。
  • ""这个。隐含“......并且编译的字节码对于任何一种语法都是相同的” - Oooooooh :)

标签: java oop coding-style


【解决方案1】:

variable shadowing 的情况下使用this

 class MyClass{
        int i;//1
        public void myMethod(){
            i = 10;//referring to 1    
        }

        public void myMethod(int i){//2
            i = 10;//referring to 2
            this.i = 10 //refering to 1    
        }    
    }  

由于我们的英语思维方式,this 有时也会使代码更具可读性

【讨论】:

  • 我个人觉得this.总是更具可读性。海事组织它引入了一致性。无论上下文如何,您都可以确定该变量是对象的成员。
  • @Felix 是的,它会模拟英语的this,这样会更简单
  • 我不认为@Felix 意味着它具有更多的语义意义,而是它使变量在视觉上突出并减少了认知负担:虽然你有更多的文本要阅读,但它给了你变量的直接信息。我自己在系统地使用和不使用“this”之间有点纠结:每当我在一个具有良好语言支持的 IDE 或编辑器中时,它显然显得有点矫枉过正。但是,每当您恢复阅读黑白文本中的代码时,它都会有很大帮助。这只是一种习惯。
【解决方案2】:

没有歧义。如果有,您将必须使用this

为了清楚起见,有些人推荐this。其他人建议在不需要时反对它,因为它会引入“噪音”。为了清晰起见,一些现代 IDE 或编辑器可能能够使用语法高亮显示(例如)不同于字段的参数颜色。

我个人尽可能避免使用this,并使用@unholysampler's underscore convention。与您的同事就某事达成一致,并将其纳入您的编码标准。

【讨论】:

    【解决方案3】:

    您使用this 来确保和传达您正在处理一个字段

    它允许你写一个像这样的setter

    public void setX(int x) {
      this.x = x;
    }
    

    非常简洁。

    【讨论】:

      【解决方案4】:

      您需要this. 的唯一情况是当前作用域也有同名变量。我更喜欢对所有类变量使用_variable 的约定。这样我就不必使用this.,也不会不小心触摸到一个认为它是局部范围变量的类变量。

      【讨论】:

        【解决方案5】:

        这在技术上是模棱两可的,除非你有可变阴影(Jigar 在他的回答中指出)。

        大多数情况下,如果您在非常了解类结构语法突出显示的编辑器/IDE 中工作,则可以清楚地看出变量是对象中的字段还是只是方法中定义的变量。然而,在更纯文本编辑器(例如 vim)中,语法高亮并不能说明这一点。

        话虽如此,我更喜欢使用 this.field 来引用属于对象的所有字段,因为我知道我会时不时地在我的普通 IDE 之外读取代码。它稍微有点冗长,但我不介意这是一种权衡。

        【讨论】:

          【解决方案6】:

          在您的问题中,前两个样本的内容完全相同。唯一需要this 的地方是当属性被局部变量遮蔽时:

          public class Test {
              private int a;
          
              public void noShadow() {
                  System.out.println(a); // attribute
              }
          
              public void shadow(int a) {
                  System.out.println(a); // parameter
                  System.out.println(this.a); // attribute
              }
          }
          

          现在我认为没有绝对的最佳实践,尤其是现代 IDE 提供高级语法高亮显示。有些人喜欢在属性前加上_m_ 等,而不是使用this。有些人更喜欢强制使用this,并且不对属性添加任何命名规则。你要做的很大程度上取决于现有的代码或现有的编码标准。我没有任何东西可以确保所有从事该项目的人的编码标准都是相同的。

          【讨论】:

            【解决方案7】:
            class Test
            {
              private int value;
            
              public Test(int value)
              {
                 // This is wrong
                 // value = value
            
                 // This is right
                 this.value = value;
              }
            }
            

            当成员变量被局部变量隐藏时,使用“this”访问它们。 由于“this”只是对当前对象的引用,你可以这样做:

            doSomething(this);
            

            这些基本上是您使用它的唯一方法。

            【讨论】:

            • 关于你提出的最后一点,根据你的逻辑,使用private 在几乎所有可能的用例中都是多余的,因为没有它任何声明都是“正确的”——但你已在value 字段声明中使用它。我并不是说我建议在方法调用上下文中使用 this.,我只是指出您的推理与自己的推理相矛盾。
            • 使用 this.method() 而不是 method() 是多余的,因为它编译成相同的字节码/机器码,任何这样做的理由都是纯粹的风格。
            • 但是,将变量标记为私有与受保护会隐藏继承类的变量,这在许多情况下是必要的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-11
            • 1970-01-01
            • 2014-10-26
            • 2016-07-26
            • 2015-12-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多