實現高效Java編程規範的十一條基礎規則

來源:互聯網
上載者:User
編程|規範   本文介紹的Java規則的說明分為5個層級,層級1是最基本也是最重要的層級,在今後將陸續寫出其他的規則。遵守了這些規則可以提高程式的效率、使代碼有更好的可讀性等。

   (1) 避免使用NEW關鍵字來建立String對象

  把一個String常量copy到String 對象中通常是多餘、浪費時間的。

Public class test{
 Public void method(){
  System.out.print (str);
 }
 private String str = new String ("1"); //這裡建立對象是完全沒有必要的
 private String str2=”2” //正確的應該如此
}
   (2) 避免使用不必要的嵌套

  過多的嵌套會使你的代碼複雜化,減弱可讀性。

Public class test {
 String add (){
  Int c=(a=a+b)+b; //過於複雜
  Return c
 }
}
   (3) 避免在同一行聲明不同類型的多個變數

  這樣可以使程式更加清晰,避免混亂

private int index, index1[];
  正確的應該如此:

private int index;
private int index1[];
   (4) 在每一行裡寫一條語句

  這條規則不包括for語句:比如:'for (int i = 0; i < 10; i++) x--;’可以增加代碼的可讀性。

public class OSPL {
 int method (int a, int b) {
  int i = a + b; return i; // 可讀性不強
 }
  正確的:

public class OSPLFixed {
 int method (int a, int b) {
  int i = a + b;
  return i;
 }
}
   (5)經常從finalize ()中調用super.finalize ()

  這裡的finalize ()是java在進行垃圾收集的時候調用的,和finally不一樣。如果你的父類沒有定義finally()的話,你也應該調用。這裡有兩個原因:(1)在不改變代碼的情況下能夠將父類的finally方法加到你的類中。 (2)以後你會養成習慣調用父類的finally方法,即使父類沒有定義finally方法的時候。

  正確的方法應該如此:

public class parentFinalize {
 protected void finalize () throws Throwable {
  super.finalize(); // FIXED
 }
   (6) 不要在finalize ()中登出listeners

  不要再finalize ()方法中中登出listeners,finalize ()只有再沒有對象引用的時候調用,如果listeners從finalize()方法中去除了,被finalize的對象將不會在垃圾收集中去除。

public void finalize () throws Throwable {
 bButton.removeActionListener (act);
}
   (7) 不要顯式的調用finalize ()方法

  雖然顯式的調用這個方法可以使你確保你的調用,但是當這個方法收集了以後垃圾收集會再收集一次。

public class T7 {
 public void finalize() throws Throwable {
  close_resources ();
  super.finalize ();
 }
 public void close_resources() {}
}
class Test {
 void cleanup () throws Throwable {
  t71.finalize(); // 調用
  t71 = null;
 }
 private t71 = new T7 ();
}
  對於這樣的調用我們應該自己建立一個釋放的方法,做最初finalize ()所作的事情,當你每次想顯式的調用finalize ()的時候實際上調用了釋放方法。然後再使用一個判斷欄位來確保這個方法只執行一次,以後再調用就沒關係了。

public class T7 {
 public synchronized void release () throws Throwable{
  if (!_released) {
   close_resources (); // do what the old 'finalize ()'
   did _released = true;
  }
 }
 public void finalize () throws Throwable {
  release ();
  super.finalize ();
 }
 public void close_resources() {}
 private boolean _released = false;
}
class TestFixed {
 void closeTest () throws Throwable {
  t71 .release (); // FIXED
  t71 = null;
 }
 private T7 t71 = new T7 ();
}
   (8)不要使用不推薦的API

  盡量使用JDK1.3推薦的API。在類和方法或者java組件裡有很多方法是陳舊的或者是可以選擇的。有一些方法SUN用了"deprecated“標記。最好不要使用例如:

private List t_list = new List ();
t_list.addItem (str);
  如果查一下javadoc的話,會發現建議用add()來代替addItem()。

   (9)為所有序列化的類建立一個'serialVersionUID'

  可以避免從你各種不同的類破壞序列的相容性。如果你不特別制訂一個UID的話,那麼系統為自動產生一個UID(根據類的內容)。如果UID在你新版本的類中改變了,即使那個被序列化的類沒改變,你也不能還原序列化老的版本了。

public class DUID implements java.io.Serializable { public void method () {}}
  在裡面加一個UID,當這個類的序列化形式改變的時候,你也改變這個UID就可以了。

public class DUIDFixed implements java.io.Serializable {
 public void method () {}
 private static final long serialVersionUID = 1;
}
   (10)對於private常量的定義

  比較好的做法是對於這樣的常量,加上final標記,這樣的常量從初始化到最後結束值都不會改變。

private int size = 5;
  改變後的做法是:

private final int size = 5;
   (11)避免把方法本地變數和參數定義成和類變數相同的名字

  這樣容易引起混擾,建議把任何的變數字都定義成唯一的。這樣看來,SCJP裡的那些題目在現實中就用不到了:)

public void method (int j) { final int i = 5; // VIOLATION } private int j = 2;
  建議:

public void method (int j1) { final int i = 5; // VIOLATION } private int j = 2;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.