为什么Java使用this.member的约定?

时间:2010-08-06 09:13:29

标签: java coding-style naming-conventions

我经常看到java代码中使用的以下命名约定。

class SomeClass {
    private final String name;

    public SomeClass(final String name) {
        this.name = name;
    }
}

这对我来说似乎有些奇怪。首先如果你碰巧拼错了方法签名中的变量,它仍然会编译......

class SomeClass {
    private final String name;

    public SomeClass(final String nane) {
        this.name = name;
    }
}

编译好。可能将nane标记为未使用的变量,但是赋值(它只是一个自我赋值)会静默编译。

我发现自己想要将'm'用于成员变量......

class SomeClass {
    private final String mName;

    public SomeClass(final String name) {
        mName = name;
    }
}

它比.this变体短,并且捕捉到之前显示的奇怪拼写错误。

然而,当我把这个作为我们新项目的惯例提出来时,我的同事给了我各种各样的瑕疵,说“在java中我们不这样做。”。

好奇为什么?

8 个答案:

答案 0 :(得分:15)

我个人不喜欢使用前缀 - 它使代码更难阅读,IMO。我相信不同的人会以不同的方式阅读 - 我最终会“大声朗读”并且前缀会中断此过程。显然你可以习惯它,但我宁愿不必这样做。

然而,声称​​ no-one 使用这样的前缀是错误的。我曾在各种使用Java的公司工作过 - 有些使用过前缀,有些则没有。

我还要指出,大多数IDE会在你的错字示例中给出关于无操作分配的警告。例如,在Eclipse中我得到:

The assignment to variable name has no effect

如果你经常忽略警告,我会说你有更大的问题:)

答案 1 :(得分:9)

我宁愿仅在少数几个需要的地方使用this来清除歧义,而不是在代码中随身携带前缀无处不在的

答案 2 :(得分:5)

对成员变量使用特定的前缀是一种匈牙利表示法 - 技术性的,坏的种类。信息(什么是成员变量)不在代码中,不需要复制它。

正如您所指出的,一个好的IDE会警告您未使用的变量(并且可能允许您将该警告转换为错误)。语法高亮还将区分本地变量和成员变量。为什么想出一个丑陋的代码约定来完成IDE的一个非常特殊的程序员错误的可能性呢?

答案 3 :(得分:2)

现代IDE(如Eclipse)可以自动为您生成getter和setter,这样可以避免麻烦。

答案 4 :(得分:1)

在第一个示例中,this限定符是显式引用实例成员name而不是局部变量(方法参数)name所必需的。

当你提到参数名称拼写错误的可能性时,你是对的,这是一些令人沮丧的错误的根源。在过去,我也使用字段的前缀命名约定,但随着java越来越依赖于反射,这确实引入了一定程度的痛苦,所以最近我已经离开了它。

通过使用单元测试,以及在签入之前使用分析代码的IDE并为您标记这些错误的孩子,可以减少由于拼写错误导致的错误的可能性。

答案 5 :(得分:1)

我觉得你的问题假设是

,这看起来很奇怪
  

Java使用this.member

的约定

这不是真的,因为不同的人有不同的惯例。 在我的代码中有很多this.member,但这只是因为我的IDE(netbeans)生成了这个,并且我并不在乎重写。

答案 6 :(得分:1)

this.member不是约定,但有必要,例如,当您必须在方法中显式引用具有相同地方变量名称的实例变量时。

在其他非强制性情况下,你可以省略它,因为它是隐含的,并选择你想要的约定。

答案 7 :(得分:0)

我实际上有一个演讲,我的一个教授在作业中给了我们以下的java类:

public class Person {
    private String name;
    private int age;

    public Foo(String __name, int __age) {
        name = __name;
        age = __age;
    }

    public String sayHello() {
        return "Hello, my name is " + name + " and I am " + age + " years old";
    }
}

我提到了Java Coding Conventions 并且善意地问他是否可以重构他的代码。基本上this用于编写美丽的构造函数和编辑器。当然,对于我需要将方法参数重命名为 underunder +参数名称甚至更好的 p +参数名称的所有其他情况,正如我经常看到的那样。