良好的Java风格

 
简介

这是这个两部分的关于Java编码风格系列的结论部分。在第一部分中,我介绍了我用良好的习惯来编写Java的一些情况,解释了为什么我们应该关心我们代码的样子,并且展示了良好Java风格的一些基本要素。在这个部分,我会展示良好Java风格的更多要素,并把我的情况作一个总结。


源文件

有很多种方式来组织Java源文件。这是工作得很好的一个:

文件头注释(可选)。
包声明。
空行或其它分隔符。
导入声明。
空行或其它分隔符。
类。


例1. 坏的文件组织。

  1.    package org.rotpad;
  2.    import java.awt.*;
  3.    import javax.swing.event.*;
  4.    import org.javacogs.*;
  5.    import javax.swing.*;
  6.    import java.awt.event.*;
  7.    class Foo {
  8.     ...
  9.    }
  10.    public class RotPad extends JFrame {
  11.     ...
  12.    }



例2. 好的文件组织。

  1.    package org.rotpad;
  2.    
  3.    // Java classes
  4.    import java.awt.*;
  5.    import java.awt.event.*;
  6.    import javax.swing.*;
  7.    import javax.swing.event.*;
  8.    
  9.    // JavaCogs classes
  10.    import org.javacogs.*;
  11.    
  12.    /**
  13.     * RotPad is a simple GUI application for performing rotation ciphers on plain 
  14.     * text.
  15.     *
  16.     * @author Thornton Rose
  17.     * @version 1.0
  18.     */
  19.    public class RotPad extends JFrame {
  20.       ...
  21.    }
  22.    
  23.    //-----------------------------------------------------------------------------
  24.    
  25.    /**
  26.     * Foo is ...
  27.     *
  28.     * @author Thornton Rose
  29.     * @version 1.0
  30.     */
  31.    class Foo {
  32.       ...
  33.    }



导入声明

一个复杂的类可以有大量的导入,这些导入会变得不可控制,特别是如果你喜欢导入单个类而不是整个包(比如,java.awt.*)。为了能够处理这些导入,像下面这样来处理它们:

Java标准类(java.*)。
Java扩展类(javax.*)。
第三方类。
应用程序类。

一定要为第三方类和应用程序类作注释,特别是那些名字不容易让人辨认的类。使用行尾注释,或者在这一部分的开头放一个注释。同样,如果你真的想成为一个完美主义者,那么按照字母顺序为导入的每一组类进行排序。


例3. 坏的导入风格。

  1.    import java.util.*;
  2.    import javax.swing.*;
  3.    import java.awt.event*;
  4.    import com.gensym.com.*;
  5.    import javax.swing.table.*;
  6.    import com.pv.jfcx.*;
  7.    import java.awt.*;
  8.    import com.melthorn.util.*;



例4a. 好的导入风格。

  1.    import java.awt.*;
  2.    import java.awt.event*;
  3.    import java.util.*;
  4.    import javax.swing.table.*;
  5.    import com.gensym.com.*;     // BeanXporter
  6.    import com.pv.jfcx.*;        // ProtoView
  7.    import com.melthorn.util.*;  // Utilities


例4b. 好的导入风格。

   
  1.    // Java classes
  2.    import java.awt.*;
  3.    import java.awt.event*;
  4.    import java.util.*;
  5.    import javax.swing.table.*;
  6.                            
  7.    // BeanXporter
  8.    import com.gensym.com.*;     
  9.                            
  10.    // ProtoView GUI components
  11.    import com.pv.jfcx.*;
  12.                            
  13.    // Application classes
  14.    import com.melthorn.util.*;





组织Java源文件的时候如果不把类组织好,那么你同样得不到良好的风格。现在教你如何组织源文件里的类。


Javadoc注释或者其它头注释。
类声明。
域(Field)声明。
空行或其它分隔符。
构建器。
空行或其它分隔符。
方法,除了main(),有逻辑的聚合起来。
空行或其它分隔符。
内部类。
空行或其它分隔符。
main()。


例5. 坏的类风格。

  1.    // RotPad -- GUI app. for ROT ciphering
  2.    public class RotPad extends JFrame {
  3.    private static final String TRANSFORM_ROT13    = "ROT13";
  4.    private static final String TRANSFORM_ROT13N5  = "ROT13N5";
  5.    private static final String TRANSFORM_ROTASCII = "ROT-ASCII";
  6.    
  7.    private void jbInit() throws Exception {
  8.       ...
  9.    }
  10.    
  11.    public static final String TITLE   = "RotPad";
  12.    public static final String VERSION = "1.0";
  13.    
  14.    public static void main(String[] args) {
  15.       ...
  16.    }
  17.    
  18.    public RotPad() {
  19.       ...
  20.    }
  21.    
  22.    private JPanel jPanel1 = new JPanel();
  23.    private JPanel jPanel2 = new JPanel();
  24.    private BorderLayout borderLayout1 = new BorderLayout();
  25.    ...
  26.    }



例6. 好的类风格。

  1.    /**
  2.     * RotPad is a simple GUI application for performing rotation ciphers on plain 
  3.     * text.
  4.     *
  5.     * @author Thornton Rose
  6.     * @version 1.0
  7.     */
  8.    public class RotPad extends JFrame {
  9.       // Public constants
  10.        
  11.       public static final String TITLE   = "RotPad";
  12.       public static final String VERSION = "1.0";
  13.        
  14.       // Private constants
  15.       
  16.       private static final String TRANSFORM_ROT13    = "ROT13";
  17.       private static final String TRANSFORM_ROT13N5  = "ROT13N5";
  18.       private static final String TRANSFORM_ROTASCII = "ROT-ASCII";
  19.      
  20.       // GUI components [JBuilder generated]
  21.        
  22.       private BorderLayout borderLayout1 = new BorderLayout();
  23.       private JPanel jPanel1 = new JPanel();
  24.       private JPanel jPanel2 = new JPanel();
  25.       ...
  26.       
  27.       /**
  28.        * Construct a new instance of this class.
  29.        */
  30.       public RotPad() {
  31.          ...
  32.       }
  33.       
  34.       /**
  35.        * Initialize UI components. [JBuilder generated]
  36.        */
  37.       private void jbInit() throws Exception {
  38.          ...
  39.       }
  40.        
  41.       ...
  42.       
  43.       //--------------------------------------------------------------------------
  44.      
  45.       /**
  46.        * Start the application.
  47.        */
  48.       public static void main(String[] args) {
  49.          ...
  50.       }
  51.    }



域声明

一些类有大量的域,如果不组织好的话,维护起来是非常难的。像下面这样来组织它们:

public常量( finalstatic  final)。
public变量。
protected常量
protected变量。
package常量。
package变量。
private常量。
private变量。


而且,写域声明的时候遵守下面的原则:

每行只写一个声明。
最起码,为public和protected域写Javadoc注释。
常量名用大写,因为大写使它们在声明和表达式中都更加显眼。
如果你使用能够产生域声明的工具,比如JBuilder或者Visual Cafe,要把自动产生的域和其它的域分开,这样维护UI代码的时候会容易一些。


例7. 坏的域风格。

  1.    public class CustomerSearchDialog extends JDialog {
  2.       private JLabel firstNameLabel = new JLabel();
  3.       private JLabel lastNameLabel = new JLabel();
  4.       public static final RESULT_SELECT = 1;
  5.       private Vector results = new Vector(); // Search results.
  6.       private DefaultTableModel tableModel = new DefaultTableModel();
  7.       public static final RESULT_CANCEL = 0;
  8.       // ...
  9.    }



例8. 好的域风格。

  1.    /**
  2.     * ...
  3.     */
  4.    public class CustomerSearchDialog extends JDialog {
  5.       /**
  6.        * Indicates that search was cancelled; returned by showDialog() when
  7.        * user clicks cancel button.
  8.        */
  9.       public static final RESULT_CANCEL = 0;
  10.       
  11.       /**
  12.        * Indicates that a customer was selected; returned by showDialog() when
  13.        * user clicks select button.
  14.        */
  15.       public static final RESULT_SELECT = 1;
  16.       
  17.       private Vector            results    = new Vector();             // Search results.
  18.       private DefaultTableModel tableModel = new DefaultTableModel();  // Grid model.
  19.       
  20.       // GUI fields. [JBuilder]
  21.       
  22.       private JLabel firstNameLabel = new JLabel();
  23.       private JLabel lastNameLabel = new JLabel();
  24.       // ...
  25.    }



方法声明

编写方法声明的时候遵守下面的原则:


总是要有Javadoc注释或其它头注释。
总是要把访问修饰符放在前面。
如果行太长,把它分为一行或多行。
如果方法参数过多,考虑每行只放一个。
不要在方法名和开圆括号("(")之间加入空格。
总是在闭圆括号(")")和开大括号("{")之间加入空格(它可以是一个分行符)。


例9. 坏的方法风格。

  1.    public int getTypeCount (String custType)
  2.    {
  3.    ...
  4.    }
  5.    static public getInstance(){ ... };
  6.    public void showRange()
  7.       throws RangeException {
  8.     ...
  9.    }



例10. 好的方法风格。

  1.    /**
  2.     * Return the single instance of this class.
  3.     */
  4.    public static CalculationEngine getInstance() {
  5.       return instance;
  6.    }
  7.    
  8.    /**
  9.     * Calculate the consumption coefficient.
  10.     */
  11.    public float calculateConsumptionCoefficient(int base, float variance, 
  12.          int iterations) throws RangeException {
  13.       // ...
  14.    }
  15.   
  16.    /**
  17.     * Calculate the consumption coefficient.
  18.     */
  19.    public float calculateConsumptionCoefficient(
  20.          int base, 
  21.          float variance, 
  22.          int iterations) 
  23.       throws RangeException
  24.    {
  25.       // ...
  26.    }
  27.    
  28.    /**
  29.     * Calculate the consumption coefficient.
  30.     */
  31.    public float calculateConsumptionCoefficient(int base, 
  32.                                                 float variance, 
  33.                                                 int iterations) 
  34.       throws RangeException
  35.    {
  36.       // ...
  37.    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值