JAVA編碼規(guī)范細(xì)節(jié)整理

1 ?enum不能用作 變量名

備注:java 5以后enum是關(guān)鍵字

2 ?equals(obj)和hashCode()應(yīng)該同時被重寫

備注:特殊情況下我們要重寫equals用來實現(xiàn)某些功能,但是同時必須要重寫hashCode;如果obj1.equals(obj2) = true則obj1和obj2對應(yīng)的內(nèi)存地址應(yīng)該相同,hashCode()返回的就是obj的對應(yīng)的內(nèi)存地址

3 ?equals(T obj)和compareTo(T obj)應(yīng)該一起被重寫

備注:嚴(yán)格要求來講equals沒有必定要和compareTo一起被重寫,但是從正常的邏輯角度來說obj.equals(obj2) = true應(yīng)該是obj.compareTo(obj2) = 0

4 ?java.lang.Error不應(yīng)該被繼承

備注:Error和他的子類代表異常的情況,例如內(nèi)存溢出,通常只有java虛擬機(jvm)會接觸到。

5使用object ==null替代object.equals(null)

備注:如果object為null使用object.equals(null)會拋出空指針異常

6 ?switch語句至少要含有3個分支

備注:如果只有2個分支,使用if else來進(jìn)行邏輯處理

7 ?switch語句不應(yīng)該包含不是case的標(biāo)簽

備注:switch(variable){

case 0:

myLabel:

result = 0 ;

break ;

case 1:…

default:…

}(錯誤的寫法)

switch(variable){

case 0:…

case 1:…

}(正確的寫法)

8匿名類的長度不應(yīng)該太長(建議的長度是不超過20行)

備注:匿名類代碼長度過長,應(yīng)該新建一個類(從代碼可讀性的角度)

9[](數(shù)組符號)應(yīng)該放在方法簽名的類型后面

備注:int[] ??foo();(正確的寫法)int foo()[];(錯誤的寫法)

10[]應(yīng)該放在類型的后面而不是變量名的后面

備注:int[] arr ;(正確的寫法)int arr[] ;(錯誤的寫法)

11不應(yīng)該在一條表達(dá)式里面含有子表達(dá)式

備注:int a = 10 + 12 ; System.out.println(a);(正確的做法)

System.out.println(10 + 12) ;(錯誤的代碼)

這樣的好處是代碼可讀性強

12避免數(shù)組的循環(huán)

備注:使用System.arrayCopy方法替代數(shù)組循環(huán)來拷貝數(shù)據(jù)2個數(shù)組之間的數(shù)據(jù)

13避免使用assert作為標(biāo)識

14避免捕獲空指針異常

備注:正常情況下代碼不會拋出空指針異常,catch模塊會隱藏原有的異常,導(dǎo)致其他更多微妙的錯誤

15避免代碼注釋掉的行

16在BigDecimal的構(gòu)造方法中,避免使用數(shù)字的構(gòu)造方法

備注:new BigDecimal(.1)這個不等于0.1其實是等于.1000000000000000055511151231257827021181583404541015625,因為0.1不等用二進(jìn)制數(shù)來表示,建議使用new BigDecimal(“0.1”)來代替

17避免拋出 空指針異常

備注:很多人猜測這是虛擬機拋出的異常,考慮使用IllegalArgumentException(非法參數(shù)異常)

18避免復(fù)雜度過高的類

19避免太復(fù)雜的方法

20整數(shù)實例化

備注:不要創(chuàng)建已經(jīng)存在的整數(shù),如BigInteger.ZERO, java 1.5以后的BigDecimal.ZERO ,BigDecimal.ONE

21布爾對象的實例化

備注:避免創(chuàng)建布爾值,可以使用Boolean.TRUE /Boolean.FALSE或者Boolean.valueOf();

22有問題的空檢查

備注:如果一個對象為null ,調(diào)用這個對象的方法會出現(xiàn)空指針異常,有可能是因為你用||替代了&&

23大小寫不敏感的字符串比較,不應(yīng)該通過中間變量來進(jìn)行比較

備注:boolean result = foo.equalsIgnoreCase(bar)(正確的寫法);

boolean result = foo.toLowerCase().equlas(bar.toLowerCase());(錯誤的寫法)

第二種寫法效率比較低

24 ?ToArray類型轉(zhuǎn)換的異常

備注:如果你想要得到某個集合類的數(shù)組,你需要傳遞一個指定類的數(shù)組參數(shù)到toArray方法中,否則你會得到類型不匹配的異常

25類的命名需要遵循命名規(guī)范

備注:命名規(guī)范一般是大寫字母開頭,一般有camel命名規(guī)則

26類的變量不應(yīng)該用public修飾

備注:public修飾變量不遵循java的封裝原則

27在com.sun.*和sun.*的包 不應(yīng)該被使用

備注:在com.sun.*和sun.*的類是被認(rèn)為某些方法的具體的實現(xiàn),但是他們不是java api的一部分,當(dāng)jdk的版本發(fā)生變化,可能會出現(xiàn)問題。

28關(guān)閉資源

備注:保證資源(像Connection Statement ResultSet)在使用過后關(guān)閉

29 ?if語句應(yīng)該被合并

備注:if(condition1 ){ if(condition2) {…}}(錯誤的寫法)

if(condtion1 && condition2) {…}(正確的寫法)

30使用Collection.isEmpty()來判斷Collection是否為空

備注:使用Collection.size()也有同樣的效果,但是Collection.isEmpty()代碼更易讀。

31代碼注釋不應(yīng)該放在 代碼的結(jié)尾

備注:

//correct comment

int a = 1 ;(正確的注釋)

int ?a = 1 ; // wrong comment(錯誤的注釋)

32使用equals來比較2個object的引用

33常量命名需要遵循命名規(guī)范

備注:常量命名的正則表達(dá)式是^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$

34常量應(yīng)該被申明為final static而不僅僅是final

備注:如果僅用final修飾變量,對于多個實例化的對象都會增加使用內(nèi)存。

35常量不應(yīng)在接口中被定義

36構(gòu)造函數(shù)調(diào)用重寫的方法

備注:調(diào)用可重寫的構(gòu)造方法產(chǎn)生對象,可能會存在風(fēng)險。例如

public class SeniorClass(){

public Senior(){

return toString();

}

public String toString(){

return“Imseniorclass”;

}

}

public class Junior extends SeniorClass(){

public Junior(){

super();

name=”Junior”;

}

public toString(){

return name.toUperCase();

}

}

37邏輯控制語句,if, for, while和switch不應(yīng)該嵌套太深

備注:嵌套的if, for,while,switch語句嵌套太深,可讀性比較差,最多嵌套長度為3

38過時的代碼應(yīng)該被移除

備注:對于被用@Deprecated標(biāo)注的代碼,應(yīng)該最終被刪除

39過時的元素應(yīng)該同時擁有申明并且在javaDoc中有標(biāo)志

備注:public class foo(

@Deprecated

public void f1(){}(不正確的寫法)

/**

* @Deprecated

*/

public void f2(){}(不正確的寫法)

/**

*@Deprecated

*/

@Deprecated

public void f3(){}(正確的寫法)

)

40重復(fù)的代碼塊

備注:重復(fù)的代碼塊應(yīng)該被抽出來公用

41應(yīng)該返回空的數(shù)組或者集合類而不是null

備注:返回空的數(shù)組或者集合,而不是null可以降低復(fù)雜度,同時減少空指針異常的概率。

42 ?Empty Finalizer

備注:如果finalizer()方法是空的,那么它沒必要出現(xiàn)

43空的語句應(yīng)該被刪除

備注:空的方法,循環(huán),都應(yīng)該被刪除

44 ?Enumeration不應(yīng)該被實現(xiàn)

備注:根據(jù)oracle的java官方文檔,enumeration接口是復(fù)制的iterativeor接口,而且iterator接口中,增加了可供原則的remove方法,以及更短的方法名。

45異常類應(yīng)該是不可改變的

備注:異常意味著當(dāng)錯誤出現(xiàn)的時候,應(yīng)用的一個狀態(tài),用final修飾可以確保錯誤的異常狀態(tài)不會被改變,例子如下

public class MyException extends Exception{

private int status ;

public MyException(String msg){

super(msg);

}

public int getStatus(){

return status ;

}

public void setStatus(int status ){

this.status = status;

}

}(錯誤的寫法)

public class MyException extends Exception{

private final int status ;

public MyException(String msg){

super(msg);

this.status = status ;

}

public int getStatus(){

return status ;

}

}(正確的寫法)

46異常處理模塊應(yīng)該提供上下文并且保留原始的異常信息

備注:try{…}catch(Exception e){ LOGGER.info(e)}…(錯誤的寫法)

try{…}catch(Exception e){LOGGER.info(‘context’, e); }(正確的寫法)

47異常類型不應(yīng)該在catch塊中使用“的instanceof”測試

備注:try{..

}catch(Exception e){

if(e instanceof IOException){…}

if(e instanceof NullPointerException){…}

}(錯誤的寫法)

try{

}catch(IOException e){

}catch(NullPointerException e){

}(正確的寫法)

48在finally塊中不應(yīng)該拋出異常

備注:try {

} catch(Exception e){

}finally{

throw new Exception();

}(錯誤的寫法)

try{

}catch(Exception e){

}finally{

//clean up

}(正確的寫法)

49只能由JVM出發(fā)垃圾回收的方法

備注:主動調(diào)用System.gc()或者Runtime.getRuntime().gc()不是個好主意,因為JVM的供應(yīng)商,版本都未知

50表達(dá)式不應(yīng)該太復(fù)雜

備注:復(fù)雜度最高為3

51變量名遵循命名規(guī)范

備注:正則表達(dá)式^[a-z][a-zA-Z0-9]*$

52有FIXME標(biāo)示的地方應(yīng)該要被處理

備注:FIXME標(biāo)示通常是用來表示該處代碼有bug,但是可能要稍后才進(jìn)行處理,這條規(guī)則是要表示bug要持續(xù)追蹤,并確保他不會被忽視

53通用的異常Error,RuntimeException,Throwable不應(yīng)該向外拋出

備注:

public void foo() throws Throwable{ throw new Exception(“my message”) ; }(錯誤的寫法)

public void foo(){ throw new MyException(“my message exception”)}(正確的寫法)

54冪等操作

備注:避免冪等操作,如以下例子

int x = 2 ; x = x ;(錯誤的寫法)

55 ?if語句條件不應(yīng)該總是true或者false

備注:

public void foo() { if(true){doSomething(); }}(錯誤的寫法)

public void foo() {doSomething(); }(正確的寫法)

56 ?if else for while do語句應(yīng)該使用大括號

備注:

if(condition) foo(); foo1();(錯誤的寫法)

if(condition){

foo();

}

foo1();(正確的寫法)

57低效的字符串緩沖

備注:避免在Stringbuffer中連接非文字或者使用append()方法

58實例化獲取類

備注:避免通過實例化一個類來獲取類例如Class c = new String().getClass() ;應(yīng)該寫成Class c = String.class;

59單元測試覆蓋不到的分支

備注:分支覆蓋率要達(dá)到65%

60整數(shù)的實例化

備注:在jdk 1.5版本中使用new Integer()可能會導(dǎo)致內(nèi)存分配問題,Integer.valueOf()內(nèi)存分配更加合理

61接口名稱應(yīng)該遵循命名規(guī)范

備注:^[A-Z][a-zA-Z0-9]*$

62 ?IP地址 不應(yīng)該被硬編碼

備注:IP地址 應(yīng)該寫在配置文件中

63應(yīng)該用java的集合類如List代替特定的類的實現(xiàn)如LinkedList

備注:

public HashSet foo(){

return new HashSet();

}(錯誤的寫法)

public Set foo(){

return new HashSet();

}(正確的寫法)

64 ?Labels不應(yīng)該被使用

備注:label在java里面并不經(jīng)常使用,而且很多開發(fā)者并不清楚,他是如何工作的;

65左大括號應(yīng)該放在代碼的同一行最后面

備注:

if(condition){

}(正確的寫法)

if(condition)

{

}(錯誤的寫法)

66局部變量名和各個方法參數(shù)名 需要遵循命名規(guī)則

備注:^[a-z][a-zA-Z0-9]*$

67局部變量不應(yīng)該和類中的屬性名稱一樣

備注:局部變量和類中的屬性一樣的話會導(dǎo)致代碼可讀性變差

class Foo{

int name = 12;

public Foo(int name){

this.name = name;

}(正確的寫法)

public void doSth(){

int name = 123;

System.out.println(name);

}(錯誤的寫法)

}

68 ?Logger應(yīng)該要用private static final修飾,并且應(yīng)該共享一個命名約定

備注:LOG(?:GER)?

69 ?Long類型 后綴應(yīng)該要用L來表示

備注:小寫的”l”,很容易和1混淆

70循環(huán)的計數(shù)器不應(yīng)該被在循環(huán)內(nèi)部修改

備注:

String[] names = new String[]{“a”,”b”};

for(inti = 0 ; i < names.length ; i++){

if(name[i]== null){

i = names.length ;(錯誤的寫法)

break;(正確的寫法)

}

}

71在循環(huán)體中不應(yīng)該包含超過1個的continue或者break語句

備注:

for(inti = 0 ; i < 10 ; i++){

if(i% 2 == 0){

continue ;

}

if( i % 3 == 0){

continue ;

}

}(錯誤的寫法)

for(inti = 0 ; i < 10 ; i++){

if(i % 2 == 0 || i % 3 == 0){

continue ;

}

}(正確的寫法)

72方法名應(yīng)該遵循命名規(guī)范

備注:^[a-z][a-zA-Z0-9]*$

73方法的參數(shù)名,不應(yīng)該被重新分配

備注:

public MyClass{

public String name =“12”;

public MyClass(String name){

name = name ;(錯誤的寫法)

this.name = name ;(正確的寫法)

}

public int add(int a , int b ){

a = a + b ;

return a ;(錯誤的寫法)

return a + b ;(正確的寫法)

}

}

74 ?equals方法名應(yīng)該加上@Override的注解

備注:equals方法名應(yīng)只用于重寫object.equals(o),通過這樣來防止混淆

75方法體 不應(yīng)該為空

備注:

public void foo(){

}(錯誤的寫法)

public void foo(){

//do something

}(正確的寫法)

76方法名稱不應(yīng)該被命名為hashCode

備注:命名為hashCode有2種情況

1是個bug應(yīng)該加上@Override的注解

2這不是個bug,但會使其他的開發(fā)人員混淆

77方法不應(yīng)該含有太多的參數(shù)

備注:一個方法最多含有7個參數(shù)

78在一個不能實例化的類中,方法名丟失static修飾符

備注:一個不能被實例化的類,而且沒有任何靜態(tài)方法不能被使用

79修飾符應(yīng)該有特定順序

備注:一般按照如下的順序來修飾

public protected private abstract static final transient volatilesynchronizednative strictfp

80沒有注釋的代碼的語句的行數(shù)

備注:NCSS原則(沒有注釋的源碼語句)

81代碼嵌套塊不應(yīng)該留空

備注:for(int i = 0;i < 10 ; i++){ ?}(錯誤的寫法)

for(inti = 0 ; i < 10 ; i++);(正確的寫法)

82嵌套的代碼塊不應(yīng)該被使用

備注:public voidevaluate(int operator){

switch(operator){

case ADD : {

int a = stack.pop();

int b = stack.pop();

int result = a + b ;

stack.push(result );

break ;

}

}

}(錯誤的寫法)

public void evaluate(int operator){

switch(operator){

case ADD:

foo();

break;

}

}

private void foo(){

int a = stack.pop();

int b = stack.pop();

stack.push(a + b);

}

83非構(gòu)造方法的方法名不應(yīng)該和類名相同

備注:

class Foo{

public Foo(){} ;

public int Foo(){ return 0 ; }(錯誤的寫法)

public int foo(){return 1 ; }(正確的寫法)

}

84非靜態(tài)類初始化不應(yīng)該被使用

備注:非靜態(tài)類初始化很少被使用,有時候能迷惑開發(fā)者。如以下代碼

class MyClass{

private static final Map MY_MAP = new HashMap(){

{

put(“a”,”b”);

}

};(錯誤的寫法)

private static final Map MY_MAP = ImmutableMap.of(“a”,”b”);(正確的寫法)

}

85 ?Object.finalize()不應(yīng)該被重載

備注:Object.finalize()是通過垃圾回收機制(GC)在對象不被引用的時候進(jìn)行調(diào)用的

public void finalize(int someParam){

}(錯誤的寫法)

public void someBetterName(int param){

}(正確的寫法)

86當(dāng)重寫Object.finalize()方法時 應(yīng)該用protected進(jìn)行修飾

備注:一般而言O(shè)bject.finalize()只有GC來調(diào)用,如果用public進(jìn)行修飾,他意味著任意一個caller都能調(diào)用他

87不應(yīng)該使用8進(jìn)制數(shù)

備注:

int myNumber =010 ;(錯誤的寫法)

int myNumber = 8 ;(正確的寫法)

88重寫方法不僅僅是調(diào)用父類中的方法

備注:

@Override

public void doSth(){

super.doSth();

}(錯誤的代碼)

@Override

public void doSth(){

super.doSth();

doOther();

}(正確的寫法)

89包名應(yīng)該遵循命名規(guī)范

備注:^[a-z]+(\.[a-z][a-z0-9]*)*$

90不應(yīng)該只為了toString方法而實例化一個元素

備注:

String a = new Integer(myInteger).toString()(錯誤的寫法)

String a = Integer.toString(myInteger);(正確的寫法)

91 ?public方法最多拋出一個異常

備注:為了對調(diào)用者保持復(fù)雜度,方法不應(yīng)該拋出1個以上的異常

public void delete() throws IOException, SQLException{

}(錯誤的代碼)

public void delete() throws SomeLevelException{

}(正確的代碼)

92不應(yīng)該在if - else的代碼塊中返回布爾值

備注:

if(condition){

return true ;

}else{

return false ;

}(錯誤的寫法)

return condition ;(正確的寫法)

93 ?return語句不應(yīng)該出現(xiàn)在finally模塊

備注:在finally模塊會強制執(zhí)行所有語句,之前有可能在try或者catch模塊應(yīng)該返回的是error但是在finally模塊返回的卻是OK

94右括號應(yīng)該和下一個next ,catch ,finally在同一行

備注:

if(con1){

}

else{

}(錯誤的寫法)

if(con1){

}else{

}(正確的寫法)

95右大括號應(yīng)該在放在一行的開頭

備注:

if(con1){

doSomething() ;}

else{ doOther() ; }(錯誤的寫法)

if(con1){

doSomething();

}else{

doOther();

}(正確的寫法)

96安全性,數(shù)組是直接存儲的

備注:數(shù)組是直接存儲的拷貝的對象,這個是用來防止將來元素發(fā)生變化時,數(shù)組中的元素也會發(fā)生變化

97簡化條件判斷

備注:沒有必要在instanceof前面調(diào)用null判斷,因為如果對象是null instanceof會返回false

98奇異場

備注:如果一個屬性僅僅被一個方法引用,可以考慮使用局部變量來代替這個屬性

99一條語句應(yīng)該放在單獨的一行里

備注:

a =“aa”; b =“bb”(錯誤的寫法)

a =”aa”;

b =”bb”;(正確的寫法)

100用char實例化StringBuffer

備注:StringBuffer sb = new StringBuffer(‘c’);這個字符將要被轉(zhuǎn)換成實例化StringBuffer的大小

101字符串實例

備注:避免實例一個String,這不是必須的

102字符串不應(yīng)該重復(fù)

備注:

public void foo(){

System.out.println(“action”);

System.out.println(“action”);

System.out.println(“action”);

}(錯誤的寫法)

public void foo(){

String str =“action”;

System.out.println(str);

System.out.println(str);

System.out.println(str);

}(正確的寫法)

103 ?String調(diào)用toString方法

備注:避免調(diào)用String的toString方法

104 ?String.valueOf()不應(yīng)該直接加在一個String后面

備注:增加String.valueOf()到一個String后面 減少代碼的可讀性,傳遞到String.valueOf()的參數(shù) 應(yīng)該直接加到String上面

105當(dāng)檢查字符串是否相等的時候,常量應(yīng)該放在等式的左邊

備注:

String myString = null ;

System.out.println(“equals=”+ myString.equal(“foo”))(錯誤的寫法)

String myString = null ;

System.out.println(“equals=”+”foo”.equals(myString));(正確的寫法)

106 ?String需要用equals來進(jìn)行比較

備注:String和其他的Object應(yīng)該使用equals來進(jìn)行比較

if(variable==“foo”) {}(錯誤的寫法)

if(“foo”.equals(variable)){}(正確的寫法)

107當(dāng)重寫Object.clone()方法的時候應(yīng)該調(diào)用super.clone()

備注:根據(jù)Oracle的java文檔中關(guān)于Object.clone()說明

1 ?x.clone() != x ;

2 ?x.clone().getClass() == x.getClass();

3 ?x.clone().equals(x);

4 ?super.clone()返回一個實例

5 ?super.clone()返回調(diào)用者的一個實例

6 ?object.clone()展現(xiàn)的是一個調(diào)用者的實例

class BaseClass implements Cloneable{

@Override

public Object clone() throws CloneNotSupportedException {

return new BaseClass() ;(錯誤的寫法)

return super.clone();(正確的寫法)

}

}

108 ?super.finalize()應(yīng)該在實現(xiàn)object.finalize()后調(diào)用

備注:

protected void finalize(){

releaseResource() ;(錯誤的代碼)

}

protected void finalize(){

releaseResource() ;

super.finalize();(正確的寫法)

}

109 ?switch語句應(yīng)該要添加結(jié)束語句(break , return , continue)

備注:switch(variable){

case 0 : doSomething ();(錯誤的寫法阿)

case 1: doOther(); break ;(正確的寫法)

default:

doSomthing();

}

110 ?switch中的case不應(yīng)該含有太多行

備注:一般一個case最多5行

switch(variable){

case 0 :

System.out.println(“11”);

System.out.println(“11”);

System.out.println(“11”);

break;(正確的寫法)

default:

System.out.println(“11”);

System.out.println(“11”);

System.out.println(“11”);

System.out.println(“11”);

System.out.println(“11”);

break;(錯誤的寫法)

}

111 ?switch應(yīng)該在最后含有default語句

備注:

switch(state){

case 0

case 1:

System.out.println(“11”);

break;

}(錯誤的寫法)

switch(state){

default:

System.out.println(“12”);

break;

case 0 :

System.out.println(“12”);

}(錯誤的寫法)

switch(state){

case 0 :

System.out.println(“12”);

break ;

case 1:

break;

default:

System.out.println(“123”);

break;

}(正確的寫法)

112同步類Vector Hashtable StringBuffer不應(yīng)該被使用

備注:這些Vector Hashtable StringBuffer在早期的JAVA API中是被設(shè)計成線程安全的,但是在表現(xiàn)方面并不理想,即使是在單線程的情況下使用,現(xiàn)在可以使用不同步的方法來進(jìn)行替代,使用ArrayList ,LinkedList代替Vector;HashMap替代Hashtable,StringBuilder替代StringBuffer

113 ?System.exit();Runtime.getRuntime().exit()不應(yīng)該被調(diào)用

備注:調(diào)用System.exit(int status )和Runtime.getRuntime().exit(int status )會導(dǎo)致整個java虛擬機的關(guān)閉,要小心使用;例如他不應(yīng)該由在一個J2EE容器內(nèi)的應(yīng)用進(jìn)行調(diào)用。

114 ?System.out和System.err不應(yīng)該像logger一樣被使用

備注:logger必須滿足的2個條件:用戶能容易的得到日志;日志信息有一定的格式 確保用戶能容易的瀏覽他們

115制表符(Tab)不應(yīng)該被使用

備注:開發(fā)人員不應(yīng)該因為要去閱讀源碼而去設(shè)置Tab的長度,tab應(yīng)該被禁止。

116默認(rèn)沒有名稱的包名 不應(yīng)該被使用

117一個接口或類的定義應(yīng)該按照預(yù)先定義的順序

備注:1變量定義2構(gòu)造方法3函數(shù)

public class Foo (){

public static final int OPEN = 4 ;

private int field = 0 ;

public Foo(){}

public void doSomething(){}

}(正確的寫法)

public class Foo (){

public Foo(){}

public void doSomething(){}

public static final int OPEN = 4 ;

private int field = 0 ;

}(錯誤的寫法)

118 ?Object.finalize()方法不應(yīng)該被調(diào)用

備注:根據(jù)java的官方文檔Object.finalize()是被GC調(diào)用的。

119 ?Object.finalize()方法不應(yīng)該被重寫

備注:Object.finalize()沒有明確的保證當(dāng)一個對象的引用被除去的時候,finalize()方法會被立即的調(diào)用,其中間隔可能有幾毫秒到幾分鐘,當(dāng)一些系統(tǒng)資源需要處理一個對象,最好不要依賴這個異步機制來處理它們。

120 ?Thread.run()和Runable.run()不應(yīng)該直接被調(diào)用

備注:使用Thread.run()和Runable.run()的目的是執(zhí)行代碼在一個獨立的線程,直接調(diào)用這些方法并沒有意義,因為這些處理代碼是在當(dāng)前的線程中。

Thread myThread = new Thread(runnable) ; myThread.run()(錯誤的寫法)

Thread myThread = new Thread(runnable) ; myThread.start()(錯誤的寫法)

121 ?Throwable和Error類不應(yīng)該被捕獲

備注:Throwable是所有Error和Exception的父類,Error是所有error的父類,不應(yīng)該由應(yīng)用進(jìn)行捕獲,只有Exception和他的子類才能被捕獲

try{…} catch(Throwable t){}(錯誤的寫法)

try{…} catch(Error e){}(錯誤的寫法)

try{…} catch(Exception e){}(正確的寫法)

122 ?Throw.printStackTrace()從來不應(yīng)該被調(diào)用

備注:應(yīng)該使用logger來代替

123拋出的聲明不應(yīng)該是多余的

備注:拋出相同的異常;RuntimeException或者是他的子類;子類和父類

void foo() throws MyException , MyException{}(錯誤的寫法)

void foo() throws Throwable , Excepion{}(錯誤的寫法)

void foo() throws RuntimeException {}(錯誤的寫法)

void foo() throws ???MyException{}(正確的寫法)

void foo() throws Throwable {}(正確的寫法)

void foo() {}(正確的寫法)

124 ?TODO標(biāo)志應(yīng)該被處理

125 ?Try-catch塊不應(yīng)該嵌套

備注:

try{

try{

doSomething();

}catch(RuntimeException r){

}

doSomething();

}catch(RuntimeException e){

}(錯誤的寫法)

private void dedicatedMethod(){

try{

doSomething();

}catch(RuntimeException e){

}

}

try{

dedicatedMethod();

doSomething();

}catch(Exception e){

/** ?*/

}(正確的寫法)

126參數(shù)類型的命名需要遵循命名規(guī)范

備注:^[A-Z]$

class MyClass(){

?void addAll(Collection c){}

}(錯誤的寫法)

class MyClass(){

?void addAll(Collection c){}

}(正確的寫法)

127在return語句之前不必要的局部變量

備注:避免創(chuàng)建不必要的局部變量

128沒被使用的參數(shù)

備注:避免給一個方法或者構(gòu)造函數(shù)傳遞參數(shù),但是卻不使用這個參數(shù)

129沒有被使用的局部變量

備注:當(dāng)檢測到一個局部變量聲明或分配,但未使用。應(yīng)該刪除這個變量

130沒有使用的修飾符

備注:在接口中的屬性或方法含有默認(rèn)的修飾符,變量默認(rèn)的修飾符是public static final方法的修飾符是public abstract,嵌套在接口中的類或者是接口是public static

131檢查完對象是否為null然后調(diào)用equals方法

備注:在檢查完object1 != null調(diào)用object1.equals(obj2)而不是obj2.equals(object1)

132沒有使用的私有字段

備注:當(dāng)檢測到一個私有字段聲明分配一個值,但沒有使用。

133沒有使用的私有方法

備注:沒有被使用的私有方法,意味著dead code而dead code意味著沒有存在的必要,也就是說應(yīng)該被刪除,這樣能夠減少代碼量,也能減少引入bug

134數(shù)組轉(zhuǎn)化為List

備注:使用Arrays.asList()將數(shù)組轉(zhuǎn)化為List

135使用字符的索引

備注:當(dāng)檢查單個字符的索引是,使用String.indexOf(char)來獲得,這樣速度快

136使用String Buffer的長度

備注:使用StringBuffer.length()來決定StringBuffer的長度,而不是使用StringBuffer.toString().equals()或者StringBuffer.toString().length()

137沒有用到的import應(yīng)該被刪除

備注:java文件的導(dǎo)入部分,應(yīng)該由IDE自動生成而不是依靠人工生成的,沒有使用的或者無用的導(dǎo)入會導(dǎo)致代碼的可讀性降低,應(yīng)該把這些刪除

138對不可變的對象 操作是無效的

備注:對一個不可變對象(BigDecimal或者BigInteger)進(jìn)行操作,不會改變這個對象本身,操作的結(jié)果是一個全新的對象,因此忽視操作的結(jié)果是個錯誤

139表達(dá)式不需要括號應(yīng)該刪除,以免引起誤解

備注:使用括號有時候能引起誤解,所以有的時候應(yīng)該被刪除。

return 3 ;(正確的寫法)

return (x);(錯誤的寫法)

return (x + 1);(錯誤的寫法)

int ?x = (y/2 + 1) ; (錯誤的寫法)

int ?y = ( 4 + x) *y(正確的寫法)

140工具類不應(yīng)該有公共的構(gòu)造方法

備注:工具類意味著一群靜態(tài)方法的結(jié)合,這意味著這個類并不需要被實例化,因次這不應(yīng)該有公共的構(gòu)造方法,java默認(rèn)的給每個類添加一個公共的構(gòu)造方法,因此至少一個非公用的構(gòu)造方法應(yīng)該添加到代碼中

class StringUtils{

public static String add(String s1 , String s2){

return s1 + s2 ;

}

}(錯誤的寫法)

class StringUtils{

private StringUtils(){

}

public static String add(String s1, String s2){

return s1 + s2 ;

}

}(正確的寫法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,719評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 傳送門 解讀阿里Java開發(fā)手冊(v1.1.1) - 異常日志 前言 阿里Java開發(fā)手冊談不上圣經(jīng),但確實是大量...
    kelgon閱讀 4,372評論 4 50
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,635評論 1 114
  • 11個站,終于出了地鐵。 路上都是穿著白襯衫,黑長褲的畢業(yè)生,小曼穿著紅色便服,走在人群中被推著走,竟然稍顯突兀。...
    南國小曼閱讀 233評論 1 0