首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议8:不要让旧语法困扰你

关灯直达底部

N多年前接手了一个除了源码以外什么都没有的项目,没需求、没文档、没设计,原创者也已鸟兽散了,我们只能通过阅读源码来进行维护。期间,同事看到一段很“奇妙”的代码,让大家帮忙分析,代码片段如下:


public class Client{

public static void main(Stringargs){

//数据定义及初始化

int fee=200;

//其他业务处理

saveDefault:save(fee);

//其他业务处理

}

static void saveDefault(){

}

static void save(int fee){

}

}


该代码的业务含义是计算交易的手续费,最低手续费是2元,其业务逻辑大致看懂了,但是此代码非常神奇,"saveDefault:save(fee)"这句代码在此处出现后,后续就再也没有与此有关的代码了,这做何解释呢?更神奇的是,编译竟然还没有错,运行也很正常。Java中竟然有冒号操作符,一般情况下,它除了在唯一一个三元操作符中存在外就没有其他地方可用了呀。当时连项目组里的高手也是一愣一愣的,翻语法书,也没有介绍冒号操作符的内容,而且,也不可能出现连括号都可以省掉的方法调用、方法级联啊!这也太牛了吧!

隔壁做C项目的同事过来串门,看我们在讨论这个问题,很惊奇地说“耶,Java中还有标号呀,我以为Java这么高级的语言已经抛弃goto语句了……”,一语点醒梦中人:项目的原创者是C语言转过来的开发人员,所以他把C语言的goto习惯也带到项目中了,后来由于经过N手交接,重构了多次,到我们这里goto语句已经被重构掉了,但是跳转标号还保留着,估计上一届的重构者也是稀里糊涂的,不敢贸然修改,所以把这个重任留给了我们。

goto语句中有着"double face"作用的关键字,它可以让程序从多层的循环中跳出,不用一层一层地退出,类似高楼着火了,来不及一楼一楼的下,goto语句就可以让你"biu~"的一声从十层楼跳到地面上。这点确实很好,但同时也带来了代码结构混乱的问题,而且程序跳来跳去让人看着就头晕,还怎么调试?!这样做甚至会隐祸连连,比如标号前后对象构造或变量初始化,一旦跳到这个标号,程序就不可想象了,所以Java中抛弃了goto语法,但还是保留了该关键字,只是不进行语义处理而已,与此类似的还有const关键字。

Java中虽然没有了goto关键字,但是扩展了break和continue关键字,它们的后面都可以加上标号做跳转,完全实现了goto功能,同时也把goto的诟病带了进来,所以我们在阅读大牛的开源程序时,根本就看不到break或continue后跟标号的情况,甚至是break和continue都很少看到,这是提高代码可读性的一剂良药,旧语法就让它随风而去吧!