|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解本文先容的JAVA划定规矩的申明分为3个次要级别,中级是平常开辟用的对照多的级别,在从此将连续写出其他的划定规矩。恪守了这些划定规矩能够进步程序的效力、使代码又更好的可读性等。
(1)在finally办法里关失落input大概output资本
再办法体内里界说了input大概output流的话,必要在finally内里把它关失落。
以下这几种挪用不必要恪守这条划定规矩,由于colse()办法不起感化:)
java.io.StringWriterjava.io.ByteArrayOutputStreamjava.io.ByteArrayInputStream
假如再办法前往的时分没有挪用close()办法来开释input()和output()的资本的话,会招致一个体系资本泄露。并且在任何情形下都要断定在前往全挪用了close()办法,包含呈现非常的时分。以是必要在finally办法内里到场这个办法。如许就包管了在任何情形下城市封闭资本。
毛病示例:
publicclassCIO{
publicvoidmethod(java.io.Filef){
java.io.FileInputStreamfis=null;
try{
fis=newjava.io.FileInputStream(f);
fis.read();
fis.close();
}catch(java.io.FileNotFoundExceptione1){
System.out.println("Filenotfound");
}catch(java.io.IOExceptione2){
System.out.println("I/OException");
}
//假如呈现非常,这里就不克不及包管封闭资本。
}
}
修改后的代码:
publicclassCIOFixed{
publicvoidmethod(java.io.Filef){
java.io.FileInputStreamfis=null;
try{
fis=newjava.io.FileInputStream(f);
fis.read();
}catch(java.io.FileNotFoundExceptione1){
System.out.println("Filenotfound");
}catch(java.io.IOExceptione2){
System.out.println("I/OException");
}finally{
if(fis!=null){
try{
fis.close();
}catch(java.io.IOExceptione){
System.out.println("I/OException");
}
}
}
}
}
(2)else的注重成绩.
一样平常总以为假如if语句只要一句的话,那末{}就是可要可不要的了。但是假如if有else嵌套的话,就纷歧样了,{}是必须的
毛病示例:
if(i<5)
if(i<2)
i++;
else
i--;
修正后:
if(i<5){
if(i<2)
i++;
}
else{
i--;
}
(3)不要再catch()块里甚么代码也不放
在catch()块内里放进一些毛病处置代码是一个好的习气。可是假如catch()内里有有关javadoc的代码,那也是能够的。
毛病示例:
try{
System.in.read();
}catch(java.io.IOExceptione){
//毛病
}
准确:
try{
System.in.read();
}catch(java.io.IOExceptione){
System.out.println("Descriptiveerror");
}
参考:JoshuaBloch:"EffectiveJava-ProgrammingLanguageGuide".
Addison-Wesley,2001,pp.187
(4)不要在if前提内里附值
假如如许做的话,体系会呈报毛病。在java的良多前提声明内里用附值是很不明智的,并且体系也会呈报毛病。很简单引发非常。恪守这条规者可以使保护复杂,制止纷歧致。
毛病示例:
if(b=true)
准确的:
if(b==true)
参考:Section10.4ofhttp://java.sun.com/docs/codeconv/html/CodeConventions.doc9.html#547
(5)for语句必要轮回体。
假如没有{}的话,for语句只会实行一次!
毛病示例:
for(i=0;i<10;i++);
System.out.println(i);
这里print()只会实行一次。
准确:
for(i=0;i<10;i++){//FIXED
System.out.println(i);
}
(5)不要把办法界说成main().
在java里,main()办法是一个出格的办法。以是在本人界说办法的时分不要界说如许的名字,以避免引发混扰。
(6)不要间接大概直接的界说Error和Throwable的子类
java.lang.Error只在JVM呈现变态的时分掩盖这个办法,假如你界说了间接大概不间接的类承继了类Error,也就指出了这个毛病是JVM外部的,而不是这个类的。以是关于java编译器来讲是不成见的,如许就不克不及反省毛病的非常处置了。
java.lang.Throwable是java.lang.Exception和java.lang.Error的下级类,用户假如象界说非常类的话应当承继java.lang.Exception。
毛病示例:publicclassABCextendsError
准确:publicclassABCextendsException
(7)有关"switch"语句内里的"case"成绩
最幸亏每个“case”里都界说一个”return”大概“break”来把持不要走到上面的“case”里往。假如一个”case”语句在代码的最初没有一个”break”大概”return”句,程序就会走到下一个”case”。假如这个”case”是最初一个的话,那就没甚么成绩,假如前面另有”case”的话,看起来就不太平安了。
毛病示例:
switch(i){
case1:
x=10;
break;
case2:
x=20;
default:
a=40;
break;
准确:
switch(i){
case1:
x=10;
break;
case2://VIOLATION
x=20;
break;
default:
x=40;
break;
(8)倡议不要利用System.getenv()
不倡议利用System.getenv(),这个办法看起来很好用,不外并非一切的体系都有情况变量的。不必这个办法也大概带来一些不便利。
毛病示例:
voidmethod(Stringname){
System.getenv(name);//能够用其他办法来取代
}
假如不必这个办法,我们能够用别的的办法来取代。好比:System.getProperty()’,getTypeName()等,这也能够找到java的体系属性。
参考:DavidFlanagan:"JavainaNutshell".OReilly
November,1999:ThirdEdition,pp.190-192
(9)不要利用’
’大概来分行
这两个标志看来很广泛,出格是’
’。我们常常用来作为分行用。可是分歧的体系用分歧的分行字符,以是这些字符在某些意义上违反了java的平台有关性。
毛病示例:
System.out.println("Hello
"+name);
我们能够用别的的一些办法来取代,好比println(),这个办法在分歧的体系平台上都起到不异的感化。后者保举人人用这个办法:System.getProperty("line.separator")
参考:DavidFlanagan:"JavainaNutshell".OReilly,
November1999:ThirdEdition,pp.191-192
(10)使一切的外部类"private".
Java同意一个类包括别的一个类,带是Javabytecode没有这个观点。类被编译器注释成package-private类。从更深的水平来讲,包括类的任何外部公有对象能被外部类会见的也能被统一个包内的其他类会见。
毛病示例:
publicclassINNER{
classINNER_Class{
voidsetValue(inti){
_value=i;//如今包就能够会见了
}
}
privateint_value;
}
以是必要加上privateclassINNER_Class
参考:StaticallyScanningJavaCode:FindingSecurityVulnerabilities.
JohnViega,GaryMcGraw,TomMutdosch,andEdwardW.Felten
IEEESOFTWARESeptember/October2000
(11)不要使接口序列化
假如一个字节数组包括了一个被序列化的对象。打击者就可以读到这个对象的外部形态合字段(包含private的)。
毛病示例:
publicinterfacesampleextendsjava.io.Serializable
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。 |
|