多年来,我一直在使用命名块来限制临时变量的范围.我从未在其他任何地方看到过这种情况,这让我想知道这是不是一个坏主意.特别是因为Eclipse IDE默认将这些标记为警告.
我认为,在我自己的代码中,我已经使用了这个效果.但是,既然好的程序员在看到它时会不信任它,这是非惯用的,我真的有两种方法可以从这里开始:
示例(在更大的方法中):
final Date nextTuesday;
initNextTuesday: {
GregorianCalendar cal = new GregorianCalendar();
... // About 5-10 lines of setting the calendar fields
nextTuesday = cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)
这里我使用GregorianCalendar来初始化日期,我想确保我不会意外地重复使用它.
有些人评论说你实际上不需要命名块.虽然这是真的,但原始块看起来更像是一个bug,因为意图不明确.此外,命名的东西鼓励你思考块的意图.这里的目标是识别代码的不同部分,而不是为每个临时变量赋予自己的范围.
很多人评论说最好直接采用小方法.我同意这应该是你的第一直觉.但是,可能有几个缓解因素:
使用命名范围的优点:
缺点:
不是惯用的:没有看到使用命名块的程序员(即除了我之外的所有人)都认为它有问题,因为他们无法找到对块名称的引用.(就像Eclipse一样.)让事情成为惯用语是一场艰苦的战斗.
它可以作为不良编程习惯的借口,例如:
注意:基于一些深思熟虑的回答,我已经广泛地编辑了这个问题.谢谢!
比较这种方法:
void doStuff(String val) {
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
...对于这种方法:
void doStuff(String origVal) {
String val = origVal;
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
对于前一种方法,Eclipse会发出警告"不应分配参数'val'".为什么?
在我看来,前者更清洁.首先,它并没有迫使我想出两个好名字val(想出一个好的名字就足够了).
(注意:假设val封闭类中没有命名的字段.)