|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,DustinMarx是一名专业软件开辟者,从业已有17年的工夫,他具有电子工程学士学位,仍是一名MBA。Dustin保护着一个博客,专门先容软件开辟的各个主题。克日,他撰文谈到了Java开辟中罕见的伤害旌旗灯号,提出了在一样平常的Java开辟中我们必要全力制止的一些不准确的做法。
经由多年的开辟、浏览、回忆并保护了数万行的Java代码后,我常常会看到Java代码中呈现的某些“伤害旌旗灯号”,这些旌旗灯号常常(但大概其实不老是)表示着代码呈现了某些成绩。我这里所要谈的并非那些老是毛病的理论,而是想要谈谈在某些场景下多是得当,但一般却会招致成绩的一些理论。这些“伤害旌旗灯号”偶然大概并没有成绩,但却会形成成绩的堆集,并终极招致成绩的发生。这里我总结出了一些“伤害旌旗灯号”,而且谈谈在哪些情形下他们是没有成绩的,在哪些情形下则会招致成绩。
这里将要谈及的良多“伤害旌旗灯号”一般城市收到来自于FindBugs等代码剖析工具所收回的告诫信息,盛行的JavaIDE也会将它们标志出来。不外,我发明有很多开辟者会疏忽失落这些来自于工具与IDE的告诫信息,要末是由于他们关失落了提醒信息,要末是出于本身的开辟习气或是不睬解与这些告诫信息所联系关系的风险,因而会疏忽失落告诫信息。
对援用利用==(而不是.equals)
良多Java开辟者都晓得利用==对照原生范例数据,利用.equals对照援用范例数据。这是一条很简单记着的复杂准绳,Java开辟者这么用也没甚么成绩。偶然利用==来对照尺度的Java范例援用(String、Integer、Long等等)也没成绩,不外这要取决于被缓存的值的巨细,因而这么做并非一个好的做法。偶然,我们必要反省标识的相称性而不是内容的相称性,在这类情形下利用==来对照援用就很合适了。绝对而言,我更喜好Groovy的处置体例,==相似于.equals,而===则是加倍严厉地对照标识。同理,利用!=来对照两个援用也是一个“伤害旌旗灯号”,由于假如待对照的两个对象不共享不异的标识(内存地点),即使他们具有不异的内容也老是会前往true。
对列举利用.equals(而不是==)
坦白地说,关于列举,Java开辟者利用==仍是.equals都没有太年夜干系。不外,我更偏向于对列举利用==。这么做最主要的缘故原由就是对列举利用==能够避免不当心将列举与不相干的对象举行对照(永久不会相称)。Object.equals(Object)办法能够吸收恣意对象,这意味着编译器其实不会强迫限制传出去的对象要与被对照的对象是不异的范例。一样平常来讲,我更喜好静态的编译期成绩检测而非静态运转期的成绩检测,对列举利用==能够满意这个请求。同理,在对照列举时,!=与!.equals也是一样的。
魔数与字符串字面值
我常常会在Java代码中看到有人利用“魔数”和字符串字面值。他们关于将来的保护来讲是一种“伤害旌旗灯号”,让我非常嫌疑使用的准确性。在单个地位处将其标识为常量(假如大概用列举来暗示更佳),这么做能够改良将来的保护,而且让我能够加倍自傲地信任利用这些值的一切代码都在利用着不异的值。除此以外,在一个中央界说好常量与列举能够更便利地利用IDE的“查找利用”特征来找到一切利用这些常量的中央。
字符串常量
在看到无限的相干字符串常量时,我就在想利用列举应当加倍合适。关于高度内聚的字符串常量的情形来讲更是云云,由于列举能够更好地表达出这些字符串所暗示的观点。比拟于字符串常量来讲,列举供应了编译期的静态范例平安与潜伏的功能上风。关于程序的准确性来讲,编译期的平安是最吸引我的中央。
利用Java的“goto”
很少有人会利用标签代码,假如利用了那也申明用法不妥。换句话说,假如利用了也是滥用罢了。在年夜多半情形下,利用Java的“goto”会形成代码的可读性极差。
依据感化域来断定得当的变量援用
我以为这类体例永久都是不得当的,但它却能运转,乃至偶然是被某些Java开辟者成心而为之。好比说,Java开辟者将传送进办法的变量在办法实行时指向了另外一个援用。该变量(一时指向办法参数)指向了另外一个援用,直到办法停止为止,这时候它离开了感化域。在这类情形下,在办法署名的参数界说前加上final关头字会招致编译器毛病,这也是我喜好在办法参数前加上final的缘故原由之一。关于我来讲,在办法中声明一个新的部分变量是加倍明晰且可读的体例,由于它只能在办法中利用。更加主要的是,作为代码的读者,我不晓得是开辟者成心但愿该参数名只是指向一个分歧的值仍是引进了Bug,由于将参数从头指向新的援用实践上会改动挪用真个值。假如我看到有人这么写,那末我就会找代码的编写者或是经由过程单位测试来考证代码的企图。
equals(Object)与hashCode()办法的不婚配
你通过从书的数量和开发周期及运行速度来证明:net网页编程和ruby要比java简单。 |
|