新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版用于讨论编程和软件设计的技巧
    [返回] 计算机科学论坛计算机技术与应用『 编程心得 』 → [转帖]JAVA权威规范 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 9886 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [转帖]JAVA权威规范 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客楼主
    发贴心情 [转帖]JAVA权威规范

    Java程序开发规范
    1. Java程序标准

    定義這個規範的目的是讓專案中所有的文檔都看起來像一個人寫的,增加可讀性,減少專案組中因爲換人而帶來的損失。(這些規範並不是一定要絕對遵守,但是一定要讓程式有良好的可讀性)

    Package 的命名
    Package 的名字應該都是由一個小寫單詞組成。

    Class 的命名
    Class 的名字必須由大寫字母開頭而其他字母都小寫的單詞組成

    Class 變數的命名
    變數的名字必須用一個小寫字母開頭。後面的單詞用大寫字母開頭。

    Static Final 變數的命名
    Static Final 變數的名字應該都大寫,並且指出完整含義。

    參數的命名
    參數的名字必須和變數的命名規範一致。

    陣列的命名
    陣列應該總是用下面的方式來命名:
    byte[] buffer;    
    而不是:
    byte buffer[];
        
    方法的參數
    使用有意義的參數命名,如果可能的話,使用和要賦值的欄位一樣的名字:

    SetCounter(int size)
    {  
    this.size = size;
    }
        

    Java 文件樣式
    所有的 Java(*.java) 文件都必須遵守如下的樣式規則
    版權資訊
    版權資訊必須在 java 文件的開頭,比如:

    /** * Copyright &reg; 2000 XXX Co. Ltd. * All right reserved. */    
    其他不需要出現在 javadoc 的資訊也可以包含在這?。

    Package/Imports
    package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。

    package hotlava.net.stats;
    import java.io.*;
    import java.util.Observable;import hotlava.util.Application;  
      
    這兒java.io.* 使用來代替InputStream and OutputStream 的。
    Class
    接下來的是類的注釋,一般是用來解釋類的。

    /** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */  
      
    接下來是類定義,包含了在不同的行的 extends 和 implements

    public class CounterSet   extends Observable implements Cloneable  
      
    Class Fields

    接下來是類的成員變數:

    /** * Packet counters */
    protected int[] packets;

    public 的成員變數必須生成文檔(JavaDoc)。proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有注釋。

    存取方法
    接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上。

    /** * Get the counters * @return an array containing the statistical data.  This array has been * freshly allocated and can be modified by the caller. */public int[] getPackets() {
    return copyArray(packets, offset);
    }
    public int[] getBytes() {
    return copyArray(bytes, offset);
    }
    public int[] getPackets() {
    return packets;
    }
    public void setPackets(int[] packets) {
    this.packets = packets;
    }

    其他的方法不要寫在一行上

    構造函數
    接下來是構造函數,它應該用遞增的方式寫(比如:參數多的寫在後面)。
    訪問類型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 應該在一行中,並且方法和參數另寫一行,這樣可以使方法和參數更易讀。

    public CounterSet
    (int size){  
    this.size = size;
    }

    克隆方法
    如果這個類是可以被克隆的,那麽下一步就是 clone 方法:

    public Object clone()
    {  
    try {   
    CounterSet obj = (CounterSet)super.clone();   
    obj.packets = (int[])packets.clone();   
    obj.size = size;    
    return obj;  
    }
    catch(CloneNotSupportedException e) {    
    throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());  
    }
    }

    類方法
    下面開始寫類的方法:

    /** * Set the packet counters * (such as when restoring from a database) */
    protected finalvoid setArray(int[] r1, int[] r2, int[] r3, int[] r4)  throws IllegalArgumentException
    {  
    //  // Ensure the arrays are of equal size  //
    if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
      throw new IllegalArgumentException("Arrays must be of the same size");  System.arraycopy(r1, 0, r3, 0, r1.length);  
    System.arraycopy(r2, 0, r4, 0, r1.length);
    }


    toString 方法
    無論如何,每一個類都應該定義 toString 方法:

    public String toString()
    {  
    String retval = "CounterSet: ";   
    for (int i = 0; i < data.length(); i++) {     
       retval += data.bytes.toString();
          retval += data.packets.toString();
       }    
    return retval;  
    }
    }


    main 方法
    如果main(String[]) 方法已經定義了, 那麽它應該寫在類的底部.
    代碼編寫格式

    代碼樣式
    代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)

    文檔化
    必須用 javadoc 來爲類生成文檔。不僅因爲它是標準,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因爲代碼不應該是被個人擁有的。

    縮進
    縮進應該是每行2個空格. 不要在原始檔案中保存Tab字元. 在使用不同的源代碼管理工具時Tab字元將因爲用戶設置的不同而擴展爲不同的寬度.
    如果你使用 UltrEdit 作爲你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 功能表將 Tab 轉換爲空格。

    頁寬
    頁寬應該設置爲80字元. 源代碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設置也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行. 一條語句折行後, 應該比原來的語句再縮進2個字元.

    {} 對
    {} 中的語句應該單獨作爲一行. 例如, 下面的第1行是錯誤的, 第2行是正確的:

    if (i>0) { i ++ };
    // 錯誤, { 和 } 在同一行


    if (i>0) {
    i ++
    };
    // 正確, { 單獨作爲一行 } 語句永遠單獨作爲一行.

    如果 } 語句應該縮進到與其相對應的 { 那一行相對齊的位置。

    括弧
    左括弧和後一個字元之間不應該出現空格, 同樣, 右括弧和前一個字元之間也不應該出現空格. 下面的例子說明括弧和空格的錯誤及正確使用:

    CallProc( AParameter ); // 錯誤
    CallProc(AParameter); // 正確

    不要在語句中使用無意義的括弧. 括弧只應該爲達到某種目的而出現在源代碼中。下面的例子說明錯誤和正確的用法:

    if ((I) = 42) { // 錯誤 - 括弧毫無意義
    if (I == 42) or (J == 42) then // 正確 - 的確需要括弧

    程式編寫規範
    exit()
    exit 除了在 main 中可以被調用外,其他的地方不應該調用。因爲這樣做不給任何代碼代碼機會來截獲退出。一個類似後臺服務地程式不應該因爲某一個庫模組決定了要退出就退出。

    異常
    申明的錯誤應該抛出一個RuntimeException或者派生的異常。
    頂層的main()函數應該截獲所有的異常,並且列印(或者記錄在日誌中)在螢幕上。

    垃圾收集
    JAVA使用成熟的後臺垃圾收集技術來代替引用計數。但是這樣會導致一個問題:你必須在使用完物件的實例以後進行清場工作。比如一個prel的程式師可能這麽寫:

      ...  {
        FileOutputStream fos = new FileOutputStream(projectFile);
        project.save(fos, "IDE Project File");
       }  ...

    除非輸出流一出作用域就關閉,非引用計數的程式語言,比如JAVA,是不能自動完成變數的清場工作的。
    必須象下面一樣寫:
      FileOutputStream fos = new FileOutputStream(projectFile);
      project.save(fos, "IDE Project File");
      fos.close();
    Clone
    下面是一種有用的方法:

      implements Cloneable  public    Object clone()    {  
        try {
           ThisClass obj = (ThisClass)super.clone();
            obj.field1 = (int[])field1.clone();
            obj.field2 = field2;
            return obj;
         }
    catch(CloneNotSupportedException e) {
            throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());
          }
    }

    final 類
    絕對不要因爲性能的原因將類定義爲 final 的(除非程式的框架要求)
    如果一個類還沒有準備好被繼承,最好在類文檔中注明,而不要將她定義爲 final 的。這是因爲沒有人可以保證會不會由於什麽原因需要繼承她。

    訪問類的成員變數
    大部分的類成員變數應該定義爲 protected 的來防止繼承類使用他們。
    注意,要用"int[] packets",而不是"int packets[]",後一種永遠也不要用。

    public void setPackets(int[] packets) {
    this.packets = packets;
    }
    CounterSet(int size){
    this.size = size;
    }


    2. 代码示例:
    /*
    * @(#)Blah.java
    *
    * Copyright (c) 2004-2005 ZZNODE, Inc.
    * All rights reserved.
    */

    package java.blah;

    import java.blah.blahdy.BlahBlah;

    /**
    * Class description goes here.
    *
    * @version  2005/06/23
    * @author  C.Wang
    */
    public class Blah extends SomeClass {

        public static int classVar1;//全局类变量1

        /**
         * 构造方法含义
         */
        public Blah() {
            // ...implementation goes here...
        }

        /**
         * 这个方法的功能描述
         */
        public void doSomething() {
            // ...implementation goes here...
        }

        /**
         * 这个方法的功能描述
         * @param someParam 参数含义
         */
        public void doSomethingElse(Object someParam) {
            // ...implementation goes here...
        }
    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/22 16:13:00
     
     reallyh 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      等级:大四(GRE考了1600分!)(版主)
      文章:114
      积分:1041
      门派:Lilybbs.net
      注册:2005/12/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给reallyh发送一个短消息 把reallyh加入好友 查看reallyh的个人资料 搜索reallyh在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看reallyh的博客2
    发贴心情 
    很多都是容易被忽视的细节
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/7 11:03:00
     
     xyzpyz 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:78
      门派:XHTML.ORG.CN
      注册:2006/4/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xyzpyz发送一个短消息 把xyzpyz加入好友 查看xyzpyz的个人资料 搜索xyzpyz在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看xyzpyz的博客3
    发贴心情 
    多谢,我刚学Java,对我有很大的帮助!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/7 18:27:00
     
     EliteDesperado 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:140
      门派:IEEE.ORG.CN
      注册:2006/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给EliteDesperado发送一个短消息 把EliteDesperado加入好友 查看EliteDesperado的个人资料 搜索EliteDesperado在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看EliteDesperado的博客4
    发贴心情 
    刚学java,看看
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/17 23:52:00
     
     gupike 帅哥哟,离线,有人找我吗?天蝎座1982-11-5
      
      
      等级:大一新生
      文章:2
      积分:82
      门派:XML.ORG.CN
      注册:2006/6/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给gupike发送一个短消息 把gupike加入好友 查看gupike的个人资料 搜索gupike在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看gupike的博客5
    发贴心情 
    正学JAVA  谢楼猪!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/6/10 11:32:00
     
     GoogleAdSense天蝎座1982-11-5
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 编程心得 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/30 13:03:50

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms