[英]Scope of further methods
在讨论Java编程时,我最近学到了更多关于变量作用域和声明的知识,更具体地说, 应该在尽可能最低的范围内声明变量。 这让我想到了以下示例,其中我们创建了一个新对象并将其发送到另一个函数:
method {
while(statement) {
Object newObject;
//method code
if(statement) {
newObject = new object();
} else {
newObject = new object();
}
otherMethod(newObject)
}
}
与此示例相比:
method {
while(statement) {
Object newObject;
//method code
if(statement) {
Object newObject;
newObject = new object();
otherMethod( newObject );
} else {
Object newObject;
newObject = new object();
otherMethod( newObject );
}
}
}
哪一个更正确?
您的第一个示例使用较少的代码,通常是首选。 Java将阻止您使用可能尚未初始化的变量,因此可读性不会受到太大影响。
对于更清晰的代码,您应该使用条件运算符:
otherMethod(condition? new ObjectA() : new ObjectB());
我更喜欢第一种方法。 它更灵活,更易于阅读。 if语句的职责是创建对象。 您可以通过多种方式执行此操作,并为if或else分支添加其他逻辑,并且您在概念上知道,一旦if完成,就会创建Object并准备就绪。 由于该方法位于if之后,因此您知道它将始终被调用。 由于它更好地显示了责任分工,这就是我更喜欢的方法。
我更喜欢第一个,只要你做的事情(例如用新实例调用其他方法)总是相同的,无论if的方式如何。
作为旁注,如果您有“//方法代码”,实际上有很多代码,那么我建议在if语句之前将变量声明向下移动到右边。 这样你就可以让声明尽可能接近开始使用的地方。
其他人指出,第一个更清晰,可能通常是首选。 有一些观点的空间,但我希望你会发现大多数人会更喜欢这个。 但是,如果你试图将事情保持在必要的范围内,我建议你实际上将对象的构造重构为工厂方法,以便一切都更清晰。 代替:
public void frobSomeBars() {
while ( condition1 ) {
final Bar bar;
if ( condition2 ) {
bar = makeBarType1();
} else {
bar = makeBarType2();
}
frob( bar );
}
你可以写一个Bar
工厂方法:
public Bar makeBar( final boolean condition ) {
if ( condition ) {
return makeBarType1();
}
else {
return makeBarType2();
}
}
注意:我通常更喜欢使用执行路径树来创建方法,每个叶子都在一个返回中终止。 有些人会更喜欢单个返回点,并将工厂方法写为:
public Bar makeBar( final boolean condition ) {
final Bar bar;
if ( condition ) {
bar = makeBarType1();
}
else {
bar = makeBarType2();
}
return bar;
}
然后frobSomeBars
有点简单:
public void frobSomeBars() {
while ( condition1 ) {
final Bar bar = makeBar( condition2 );
frob( bar );
}
甚至:
public void frobSomeBars() {
while ( condition1 ) {
frob( makeBar( condition2 ));
}
变量应在尽可能最低的范围内声明。
我相信你所做的是微观优化。
哪一个更正确?
我并不是说写任何东西, JVM
都会维护。在这种情况下我建议你,不要再进一步坚持第一种方法,它更清洁,更具可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.