我经常看到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中我们不这样做。”。
好奇为什么?
答案 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 +参数名称的所有其他情况,正如我经常看到的那样。