Java中十个常见的违规编码

上一篇 / 下一篇  2012-09-13 09:04:52 / 个人分类:Java

51Testing软件测试网0F#S/z8@:K_"@

  摘要:作者Veera Sundar在清理代码工作时发现一些常见的违规编码,因此,Veera Sundar把针对常见的一些违规编码总结成一份列表,以便帮助Java爱好者提高代码的质量和可维护性。51Testing软件测试网j t`'] t)Dz

"l^/ffi#E7E0  最近,我给Java项目做了一次代码清理工作。经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)重复出现在代码中。因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java爱好者提高代码的质量和可维护性。51Testing软件测试网 [,[IO#o)s

y#A q$E:i0  这份列表没有依据任何规则或顺序,所有的这些都是通过代码质量工具包括CheckStyle,FindBugs和PMD检查出。一起来看下:51Testing软件测试网2ai0C"]'W0XvUf(k

i sf8W"T(O6r-T0  一、Eclipse编译器提供源代码格式输入

"Xv#s"j?,sND2c b4A*q&\051Testing软件测试网&Bdt5w9L.F#P.y w0|i

  Eclipse提供自动源码格式选项,并且组织输入(删除未使用的代码)。你可以使用下面的这些快捷键进行操作。

lF ]d0`(RR0

9Q1Mw'eh Ra0  Ctrl + Shift + F——源代码格式51Testing软件测试网eI{tX

51Testing软件测试网EMEj wv!s(@

  Ctrl + Shift + O——组织输入并删除未使用的代码

:j\@C%oR+B051Testing软件测试网X}7ob;II

  代替手动调用这两个函数,只需根据Eclipse自动格式和自动组织选项,可以随时保存文件。51Testing软件测试网 n-e!XV:{ Q.` @UC-_

.d8|$g0Pv&` T A0   操作步骤,在Eclipse中进入Window -> Preferences -> Java -> Editor -> Save Actions,然后以选定的方式保存,最后检查Format source code + Organize imports。51Testing软件测试网UL(pN2`Od h [z

P8` t6_!j0  二、避免多个返回(退出点)

A \,?JK"YF)b051Testing软件测试网%u6QjAU.m A0Dn

  依照你的方法,确保只有一个退出点。不要在同一个地方或多个地方使用返回。比如,下面的代码,NOT RECOMMENDED(不建议),这是因为有多个退出点(返回语句)。51Testing软件测试网e1V yC3j)Z

  1. private boolean isEligible(int age){  
  2.   if(age > 18){  
  3.     return true;  
  4.   }else{  
  5.     return false;  
  6.   }  
  7. }

5uI'aI^x,\%[E0  下面的代码有所提升,这是更高版本的。

q2`H.uW I0
  1. private boolean isEligible(int age){  
  2.   boolean result;  
  3.   if(age > 18){  
  4.     result = true;  
  5.   }else{  
  6.     result = false;  
  7.   }  
  8.   return result;  
  9. }

r;dDb\;{"T%kn7uc*`0  三、简化if-else

,rU+M*h8g)}051Testing软件测试网2W]2ko.V&bm!D5p2v^]

  我写了几个实用的方法作为参考,检查语句条件并且基于该条件返回值。比如,考虑到isEligible方法,正如你之前所看到的:51Testing软件测试网"{] |N?pOR

  1. private boolean isEligible(int age){  
  2.   boolean result;  
  3.   if(age > 18){  
  4.     result = true;  
  5.   }else{  
  6.     result = false;  
  7.   }  
  8.   return result;  
  9. }
51Testing软件测试网\:w%qp'g$O2kU.B!}

  整个方法以一个单一的return语句重新编写:51Testing软件测试网3`6T7~C6Me

  1. private boolean isEligible(int age){  

  2. {BbI}:f0
  3. return age > 18;  
  4. 51Testing软件测试网8h9}%az5j.sz,Z2K
  5. }

.br#|G)J&l QJ0  四、不要给Boolean, Integer或者String创建新的实例51Testing软件测试网%PZSl]"}~

51Testing软件测试网*KQ6S'\&g/CL&{WoR6j

  避免给Boolean,Integer,String创建新的实例。比如,使用new Boolean(true),Boolean,valueOf(true)。修改后的语句与之前的效果基本相同,除了在性能上有所提升。

6W9w {/b&Gd(Al0

x+Pa:q,o?Ur{0  五、使用大括号模块语句51Testing软件测试网&n JcB-m%B7Cp

~"zf |$P zfwN z O0  永远别忘了使用大括号模块语句比如if、for、while。这样做的好处是当你在修改模块级语句时减少了模糊代码并且避免引进bug的机会。

aW0cI\5T!FQ[ b|051Testing软件测试网-ikYx;@~5JMD

  不建议:

4T`,Q9~"|0
  1. if(age > 18)  
  2.   result = true;  
  3. else  
  4.   result = false;
51Testing软件测试网KK,}'e-}iaj bg

  建议:

v9v/|;NWB7cE!]%D"j0
  1. if(age > 18){  
  2.   result = true;  
  3. }else{  
  4.   result = false;  
  5. }

&H:V"G9kXkH] I0
51Testing软件测试网XE*^O0V%j|n ]-sW

  六、以final类型标记方法参数,任何时候都适用

o6~? \9f @*N8tp051Testing软件测试网3I$u&?P~"_7S0h(O

  请记住,以final类型标记方法参数,任何时候都适用。这样做的好处在于当你不小心修改参数值时,编译器会给你警告,同时它还能以更好的方式优化编译器代码字节。51Testing软件测试网)d D-Z(S6sa

51Testing软件测试网T8r'~ M[].dt5_;[4Y

  建议:51Testing软件测试网 lo~;vK]J+_L:C

g*ZI^n ~ Qpq0

g%fIG"S0
private boolean isEligible(final int age){ ... }

Wpt.MEed g4Q0  七、在UPPERCASE中命名public static final字段

:I{Wz%ST^)O0

[(L2G[qyc/r gO_0y0  在UPPERCASE中命名public static final字段(通常也被称之为常量)。这个可以让你轻松区分常量字段和局部变量之间的不同。51Testing软件测试网0N5@S/LE3u[

51Testing软件测试网3r)x5qM#uW&s1L|

  不建议:51Testing软件测试网CU}0M] Q @&[Qv

51Testing软件测试网+Sq#k&F5r C#o

51Testing软件测试网$ojz+D$^0ic'],]%|;Tr

public static final String testAccountNo = "12345678";

,_"BGM;F_0  建议:

U?J3`NAD0

IO"\6tGK1W6O}9g{0

&I;k$Qk8[/Z Nfs:c0
public static final String TEST_ACCOUNT_NO = "12345678";,

Q2_6{)J^|0  八、组合成单一的if语句

"D)~"eNme;MLSWp0

$E3[ C)c`f_0  在尽可能多的情况下,把多个if语句组合成单一的if语句,比如下面的代码:

mV!z*QB0

sS+O wH g:[Dg051Testing软件测试网-cn%\R0j#]m$SE

  1. if(age > 18){  
  2.   if( voted == false){  
  3.     // eligible to vote.  
  4.   }  
  5. }

&bL7T pY5a^0  合并成单一的if语句:51Testing软件测试网r2j z3k9zv+X

51Testing软件测试网 m,urw[Y6D)c

T;~-oWL0
  1. if(age > 18 && !voted){  
  2.   // eligible to vote  
  3. }

2b]?1v1Af o0  九、Switch应该有default51Testing软件测试网Q6vGyX5C3O

1|w%l#f8Y PK5u"qM;]0  始终给Switch语句添加default。51Testing软件测试网sw_}!L}|i

1h[pCV%yjR0  十、使用常量来避免重复定义相同的字符串值

ed QQ,I(k051Testing软件测试网~8fE8F}"Y U.j9Q

  如果你在多个地方必须使用字符串,那么使用常量来避免重复定义拥有相同值的字符串。51Testing软件测试网"UP }W9nn E

51Testing软件测试网g-v#t+^4ql2z.L

  比如,看下面的代码:51Testing软件测试网hh"`-ZQ.B~ C#vMs

t7EM h~h+y:u)P051Testing软件测试网1hW8j#g1YI;O wu#]+Xh

  1. private void someMethod(){  
  2.   logger.log("My Application" + e);  
  3.   ....  
  4.   ....  
  5.   logger.log("My Application" + f);  
  6. }
51Testing软件测试网 {Q h.d~

  string literal“我的应用”可以作为常量并且能在代码中使用。

i%_5c8cp"N&D f051Testing软件测试网#@6q `'E_@2a7r:ow

51Testing软件测试网;t Z)ay!Oe#Yl

  1. public static final String MY_APP = "My Application";  
  2.  
  3. private void someMethod(){  
  4.   logger.log(MY_APP + e);  
  5.   ....  
  6.   ....  
  7.   logger.log(MY_APP + f);  
  8. }

TAG:

 

评分:0

我来说两句

Open Toolbar