改善Java程序的建議(每日5條)1

目錄

  • 建議一:不要再常量和變量中出現容易混淆的字母
  • 建議二: 不要讓常量蛻變成變量
  • 建議三: 三元操作符的類型務必一致
  • 建議四: 避免帶有變長參數的方法重載
  • 建議五: 別讓null值與空值威脅到變長方法

建議一:不要再常量和變量中出現容易混淆的字母

  • 包名全小寫、類名首字母全大寫,常量全部大寫並用下劃線分割,變量採用駝峯命名法等,這些都是最基本的Java編碼規範。

但是 在java中注意不要引入容易混淆的字母。嘗試閱讀以下代碼

public class Test{
	public static void main(Stringp[] args){
		long i = 1l;
		System.out.print("i的兩倍是:"+(i+i));
	}
}

可能有的觀看不自習的人看到肯定會說運行結果是22但是最終結果是2.
因爲賦值給變量i的數字就是"1",只是後面加了長整型變量的標識字母"l"而已
所以儘量避免混用。
如果字母和數字必須混合使用時,"字母l"務必要大寫,字母"O”要增加註釋

建議二: 不要讓常量蛻變成變量

不要以爲final static修飾的常量就一定不會變,不能二次複製

public class Test{
	public static void main(String[] args){
		System.out.println("常量會變:"+Const.RAND_CONST);
	}
}
interface Const{
	// 這樣還是常量嘛?
	public static final int RAND_CONST = new Random().nextInt();
}

RAND_CONT是常量嗎?它的值會變!這種常量的定義方式絕對不可取,常量就是常量在編譯器就確定了值,不應該在運行期更改,否則程序可讀性非常差,甚至連寫這個代碼的人都不能確定在運行期到底發生了什麼。

建議三: 三元操作符的類型務必一致

  • 三元操作符是if-else的間歇方式,使用的地方很多,也非常好用
public class Test{
	public static void main(String[] args){
		int i = 80;
		String s = String.valueOf(i<100?90:100);
		String s1 = String.valueOf(i<100?90:100.0);
		System.out.print("兩者是否相等:"+s.equals(s1));
	}
}

分析一下這段程序 : i是80,那它的值當然小於100,兩者的返回值肯定都是90,再轉成String類型,其值也絕對相等。恩分析的很有道理,但是變量s中三元操作符的第二個操作數是100。s1中的是100.0難道沒有影響嗎?
但是運行結果確實false
問題就在100與100.0上
s的理解正常
s1的卻不同,100.0是個浮點數 也就是三元運算符的兩個操作數類型不同,可它必須要返回以一個數據,而且類型不確定,不可能條件爲真時返回int,假時返回 浮點類型,編譯器是不允許的,所以他會類型轉換int轉換爲90.0,那他當然與整形的90不相等了
三元運算符的轉換規則

  • 若兩個操作數不可轉換,則不做轉換
  • 若兩個操作數是明確類型的表達式(比如變量),則按照正常的二進制數字來轉換,int類型轉換爲long類型,long轉換爲float類型
  • 若兩個操作數中一個是數字S,另一個是表達式,且其類型標識爲T,說數字S在T範圍內,則轉換爲T類型;若S超出了T範圍,則T轉換爲S類型
  • 若干兩個操作數都是直接量數字,則返回值類型爲範圍較大者
    注意所以我們要保證三元運算符兩個操作數類型一致

建議四: 避免帶有變長參數的方法重載

在項目中我們經常要傳遞不確定數量的參數到方法中,在JDK5之前就是把形參定義成Collection類型或其子類型,或者數組類型,缺點就是需要對空參數進行判斷和篩選。JDK5引入了變長參數就是爲了更好的提高複用性,讓方法隨心所欲的調用,當然也是要遵循一定規則的
- 變長參數必須是方法中最後一個參數
- 一個方法不能定義多個變長參數

public class Test{
	public void calPrice(int price,int discount){
		System.out.print("簡單折扣後的價格是");
	}
	public void calPrice(int price,int...discounts){
		System.out.print("複雜折扣後的價格是");
	}
}

這兩個方法是重載,但是仔細瞧瞧就是第二個參數不一樣,那麼調用時會先調用哪個方法?
Java編譯器很聰敏,會根據方法簽名確定調用哪個方法譬如calPrice(100,10)
會調用第一個方法,爲什麼吶,因爲int是一個原生數據類型,數組本身就是一個對象,編譯器想要偷懶,於是就從最簡單的開始猜想。

建議五: 別讓null值與空值威脅到變長方法

public class Test{
	public void methodA(String str,Integer ...is){
	}
	public void methodA(String str,String...strs){
	}
	public static void main(String[] args){
		Test ts = new Test();
		ts.methodA("china",0);
		ts.methodA("China","People");
		ts.methodA("china");
		ts.methodA("china",null);
	}
}

兩個methodA都進行了重載,現在的問題是:上面的代碼編譯通不過,問題出在那裏。就是這兩句ts.methodA(“china”); ts.methodA(“china”,null);,兩個方法都符合形參格式,編譯器不知道調用哪個方法。於是報錯。主要是這個方法的設計者違反了Kiss原則。所以應該這樣修改

public class Test{
	public void methodA(String str,Integer ...is){
	}
	public void methodA(String str,String...strs){
	}
	public static void main(String[] args){
		Test ts = new Test();
		String[] strs =  null;
		ts.methodA("china",strs);
	}
}

讓編譯器知道這個null值是String類型的,編譯即可順利通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章