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

为什么Java使用this.member的约定?,java,coding-style,naming-conventions,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(

我经常在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中,我们不这样做。”


想知道为什么吗?

像Eclipse这样的现代IDE可以自动为您生成getter和setter,这样就可以避免麻烦。

我个人不喜欢使用前缀-这会使代码更难阅读,我相信不同的人阅读的方式不同-我最终阅读的是“在我的脑海中大声朗读”前缀会打断这个过程。很明显,你可以习惯,但我宁愿不习惯

然而,声称没有人使用这样的前缀是错误的。我在使用Java的不同公司工作过——有些使用前缀,有些没有

我还要指出的是,大多数IDE都会在您的打字错误示例中给出一个关于无操作赋值的警告。例如,在Eclipse中,我得到:

The assignment to variable name has no effect

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

我宁愿只在少数需要清除歧义的地方使用
这个
,而不是将前缀拖到代码中的任何地方。

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

当您提到参数名可能拼写错误时,您是对的,这是一些令人沮丧的错误的根源。在过去,我也对字段使用前缀命名约定,但随着java越来越依赖反射,这确实会带来一定程度的痛苦,所以最近我不再使用它


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

为成员变量使用特定前缀是一种匈牙利符号-技术上的,不好的一种。信息(什么是和不是成员变量)已经在代码中,无需重复


正如您所注意到的,一个好的IDE将警告您未使用的变量(并可能允许您将该警告转化为错误)。语法突出显示还将区分局部变量和成员变量。为什么要想出难看的代码约定来完成IDE的工作,以减少一种非常特殊的程序员错误的可能性?

我实际上有一次讲座,我的一位教授在一次作业中给我们讲了以下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";
    }
}

我提到了这个问题,并亲切地问他我是否可以重构他的代码。基本上,
这个
用于编写漂亮的构造函数和setter。当然,对于其他所有需要将方法参数重命名为underunder+参数名或更好的p+参数名的情况,正如我经常看到的那样

Java使用this.member的约定

这决不是真的,因为不同的人有不同的习俗。
在我的代码中有很多这样的.member,但这只是因为我的IDE(netbeans)生成了它,我不太在乎重写它。

这个.member不是一个约定,但它是必要的,例如,当您必须在方法中显式引用与局部变量同名的实例变量时


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

这不是特定于Java的。同样的讨论也适用于许多语言,例如C#。我看到过使用“this”关键字来避免选择可微变量名,例如在如上所示传递参数时。我通常会尝试想出一个更好的变量名,但在我目前的工作中,“this”被广泛使用。你多久会犯这样的错误?我猜几乎从来没有。在很短的一段时间内,我被迫使用前缀,并在这方面犯了几个错误。我经常遇到通过简单地关注IDE告诉我的内容就可以轻松解决的错误。在本例中,还有构造函数。