我正在通过将所有变量声明为最高位置并将其初始化为null / 0 /而不是将其声明为以后需要它们来为那些启动其功能的人清理Java代码。
具体指导原则是什么?对于这种或那种方式是否存在优化原因,或者只是一种良好的做法?是否存在偏离任何正确方法的可接受的情况?
答案 0 :(得分:78)
将变量声明为尽可能靠近您使用它们的第一个点。它与效率无关,但使您的代码更具可读性。声明变量越接近使用它的位置,稍后读取代码时您必须进行的滚动/搜索越少。声明变量更接近他们使用的第一个位置也会自然地缩小他们的scope。
答案 1 :(得分:33)
正确的方法是在第一次使用变量时准确声明变量,并最小化它们的范围,以使代码更易于理解。
在函数顶部声明变量是C的保留(需要它的地方),并且绝对没有优势(变量作用域仅存在于源代码中,在字节代码中所有局部变量按顺序存在于堆栈中无论如何)。只是不要这样做。
有些人可能会试图通过声称它“整洁”来捍卫这种做法,但是在方法中“组织”代码的任何需要通常都表明该方法太长了。
答案 2 :(得分:20)
来自Java Code Conventions,Chapter 6 on Declarations:
6.3展示位置
仅在开头放置声明 块。 (一个块是任何代码 被花括号“{”和。括起来 “}”。)不要等待声明变量 直到他们第一次使用;它可以混淆 粗心的程序员和妨碍代码 范围内的可移植性。
void myMethod() { int int1 = 0; // beginning of method block if (condition) { int int2 = 0; // beginning of "if" block ... } }
该规则的一个例外是 for循环的索引,在Java中 可以在for语句中声明:
for (int i = 0; i < maxLoops; i++) { ... }
避免隐藏的本地声明 更高级别的声明。对于 例如,不要声明相同 内部块中的变量名称:
int count; ... myMethod() { if (condition) { int count = 0; // AVOID! ... } ... }
答案 3 :(得分:14)
如果在函数体内的各个孤立位置使用了kabillion变量,则函数太大。
如果你的功能是一个易于理解的尺寸,那么“所有前置”和“只需要”之间没有区别。
唯一的非前置变量将位于for
语句的正文中。
for( Iterator i= someObject.iterator(); i.hasNext(); )
答案 4 :(得分:5)
我发现根据需要声明它们比在开头声明它们时导致的错误更少。我还发现,在最小范围内声明它们也可以防止错误。
当我查看几年前声明位置生成的字节码时,我发现它们或多或少相同。根据分配时间的不同,存在着偶然的差异。甚至像:
for(Object o : list) {
Object temp = ...; //was not "redeclared" every loop iteration
}
VS
Object temp;
for(Object o : list) {
temp = ...; //nearly identical bytecoode, if not exactly identical.
}
或多或少相同
答案 5 :(得分:5)
此刻我正在做同样的事情。我正在重做的代码中的所有变量都在函数的顶部声明。我已经看到,我一直在仔细研究这几个变量被声明但是从未使用过或者它们被声明并且正在使用它们进行操作(即解析String
然后设置Calendar
对象<使用字符串中的日期/时间值)但随后不会使用生成的Calendar
对象。
我正在通过从顶部获取声明并将其在函数中向下移动到更接近使用位置的位置来清理它们。
答案 6 :(得分:5)
在比所需范围更广的范围内定义变量会妨碍可理解性。有限范围表示此变量仅对这一小块代码有意义,您无法在进一步阅读时思考。这是一个非常重要的问题,因为大脑具有微小的短期工作记忆(它表示平均只能跟踪7件事情)。少跟踪一件事是很重要的。
同样,你应该尽量避免使用字面意义上的变量。尝试将所有内容分配一次,并将其声明为最终内容,以便读者知道。不必跟踪某些事物的变化是否真的会削弱认知负担。
答案 7 :(得分:4)
我认为实际上客观证明顶级声明风格更容易出错。
如果你通过随机移动线条(以模拟合并变坏或某人不假思索地切割+粘贴)来改变任何一种风格的代码,那么声明在顶部的样式有更大的机会进行编译功能错误。
我不认为声明在顶部有任何相应的优势,不能归结为个人偏好。
因此,假设您想编写可靠的代码,请学会更喜欢做即时声明。
答案 8 :(得分:4)
4.8.2.2在需要时声明
局部变量在其开始时不习惯性地声明 包含块或块状构造。相反,局部变量是 声明接近他们第一次使用的点(在合理范围内),到 尽量缩小范围。局部变量声明通常具有 初始化程序,或在声明后立即初始化。
好吧,我会按照Google所做的那样,从一个肤浅的层面来看,声明方法/函数顶部的所有变量都会“整洁”,很明显声明变量是有益的有必要的。这是主观的,无论你觉得什么都很直观。
答案 9 :(得分:4)
原理:将局部变量声明放置在尽可能接近第一次使用的位置,而不是简单地放在方法的顶部。考虑这个例子:
/** Return true iff s is a blah or a blub. */
public boolean checkB(String s) {
// Return true if s is a blah
... code to return true if s is a blah ...
// Return true if s is a blub. */
int helpblub= s.length() + 1;
... rest of code to return true is s is a blah.
return false;
}
这里,局部变量helpblub被放置在必要的地方,在代码中测试s是否是blub。它是实现“Return true is s is a blub”的代码的一部分。 将helpblub的声明作为该方法的第一个陈述绝对没有逻辑意义。可怜的读者会想,为什么那个变量呢?它的用途是什么?
答案 10 :(得分:2)
这是一个可读性和个人偏好而不是表现的问题。编译器无关紧要,无论如何都会生成相同的代码。
答案 11 :(得分:1)
我见过人们在功能的顶部和底部声明。我更喜欢顶部,我可以很快看到它们。这是一个选择和偏好的问题。