当前位置: 首页 > 科技观察

10个实用但偏执的Java编程技巧

时间:2023-03-12 23:54:33 科技观察

在沉浸编码一段时间后(比如我在编程上投入了近20年),你会逐渐习惯这些东西。因为,你知道……任何事情都可能出错,是的,确实如此。这就是为什么我们有“防御性编程”,即一些偏执的习惯。以下是我个人认为最有用但偏执的10种Java编程技术。下面我们一起来看看:1.将String字符串放在最前面为了防止偶尔出现的NullPointerException,我们通常将String放在equals()函数的左侧,实现字符串比较,如下代码所示://Badif(variable.equals("literal")){...}//Goodif("literal".equals(variable)){...}这是你可以用大脑做的事情,来自Bad版本将表达式重写为代码的Good版本不会有任何损失。欢迎不同意见...2.不要相信早期的JDKAPI在Java早期,编程是一件很痛苦的事情。这些API还很不成熟,也许你遇到过以下代码块:String[]files=file.list();//Watchoutif(files!=null){for(inti=0;i=0){...}谁知道毛呢布。也许到时候他们将编码更改为对字符串不区分大小写,也许返回-2会更好?谁知道。4.避免意外赋值是的。这种事情可能经常发生。//Ooopsif(variable=5){...}//更好(因为导致错误)if(5=variable){...}//Intent(remember.ParanoidJavaScript:===)if(5===variable){...}所以你可以把比较常量放在左边,这样就不会发生意外的赋值错误。5.检查Null和Length不管怎样,只要你有一个集合、数组等,确保它存在并且不为null。//Badif(array.length>0){...}//Goodif(array!=null&&array.length>0){...}你不知道这些数组是从哪里来的,可能是来自更早版本的JDKAPI,谁知道呢。6.所有方法都是final的你可以告诉我你的开闭原则,但这都是废话。我不相信你(正确地继承了我父类的所有子类),我也不相信我自己(不小心继承了我父类的所有子类)。因此,对于那些含义明确的方法,应严格使用最终标记。//Badpublicvoidboom(){...}//Good.Don'ttouch.publicfinalvoiddontTouch(){...}7.如我所说,所有变量和参数都是最终的。我不相信自己(不要不小心覆盖我的价值)。话虽如此,我不相信我自己的,因为......这就是为什么所有变量和参数都是最终的。//Badvoidinput(StringimportantMessage){Stringanswer="...";answer=importantMessage="LOLaccident";}//Goodfinalvoidinput(finalStringimportantMessage){finalStringimportantMessage){finalStringanswer="...";}8.重载时不要相信泛型,这有可能发生。你相信你写的超级漂亮的API,它很直观,然后一些用户只是将原始类型转换为Object类型,直到该死的编译器停止抱怨,突然他们会链接错误的方法,认为这是你的错误。看下面的代码://Badvoidbad(Tvalue){bad(Collections.singletonList(value));}voidbad(Listvalues){...}//Goodfinalvoidgood(finalTvalue){if(valueinstanceofList)good((List)value);elsegood(Collections.singletonList(value));}finalvoidgood(finalListvalues){...}因为,你知道...你的用户,他们就像//Thislibrarysucks@SuppressWarnings("all")Objectt=(Object)(List)Arrays.asList("abc");bad(t);相信我。我都看过了。最好包括下面的偏执狂。9.DefaultofSwitchstatement总是抛异常Switchstatement...其中一个荒谬的语句我不知道是敬畏还是哭泣,但不管怎样,既然我们坚持使用switch,那么我们还是好好用吧***,看下面的代码://Badswitch(value){case1:foo();break;case2:bar();break;}//Goodswitch(value){case1:foo();break;case2:bar();break;default:thrownewThreadDeath("That'llteachthem");}当value==3时,会提示找不到,以免让人迷惑。10.带花括号的switch语句其实switch是最邪恶的语句,就像是喝醉了或者打赌输了的人在写代码,看下面的例子://Bad,doesn'tcompileswitch(value){case1:intj=1;break;case2:intj=2;break;}//Goodswitch(value){case1:{finalintj=1;break;}case2:{finalintj=2;break;}//记住:default:thrownewThreadDeath("That'llteachthem");}在switch语句中,每个case语句的作用域只有一行语句。事实上,这些case语句甚至都不是真正的语句,它们就像是goto语句中的跳转标记。结论偏执狂编程有时看起来很奇怪,因为代码往往比需求要求的更详细一些。你可能会想,“哦,那永远不会发生,”但就像我说的那样。经过20年左右的编程,你不想仅仅修复这些愚蠢的错误,因为编程语言太老了而且有缺陷。因为你知道……现在轮到你了!你在编程中最偏执的怪癖是什么?翻译链接:http://www.codeceo.com/article/10-useful-paranoid-java-coding.html英文原文:Top10Useful,YetParanoid,JavaProgrammerTechniques