ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [转载]良好的Java风格:第二部分

[转载]良好的Java风格:第二部分

原创 Linux操作系统 作者:dinner1007 时间:2019-06-09 14:36:07 0 删除 编辑
良好的Java风格:第二部分
良好的Java风格:第二部分
作者:Thornton Rose
日期:2001年2月28日
翻译:ant21



简介


这是这个两部分的关于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. // Java classes
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import javax.swing.*;
  6. import javax.swing.event.*;
  7. // JavaCogs classes
  8. import org.javacogs.*;
  9. /**
  10. * RotPad is a simple GUI application for performing rotation ciphers on plain
  11. * text.
  12. *
  13. * @author Thornton Rose
  14. * @version 1.0
  15. */
  16. public class RotPad extends JFrame {
  17. ...
  18. }
  19. //-----------------------------------------------------------------------------
  20. /**
  21. * Foo is ...
  22. *
  23. * @author Thornton Rose
  24. * @version 1.0
  25. */
  26. class Foo {
  27. ...
  28. }



导入声明


一个复杂的类可以有大量的导入,这些导入会变得不可控制,特别是如果你喜欢导入单个类而不是整个包(比如,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. // BeanXporter
  7. import com.gensym.com.*;
  8. // ProtoView GUI components
  9. import com.pv.jfcx.*;
  10. // Application classes
  11. 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. private void jbInit() throws Exception {
  7. ...
  8. }
  9. public static final String TITLE = "RotPad";
  10. public static final String VERSION = "1.0";
  11. public static void main(String[] args) {
  12. ...
  13. }
  14. public RotPad() {
  15. ...
  16. }
  17. private JPanel jPanel1 = new JPanel();
  18. private JPanel jPanel2 = new JPanel();
  19. private BorderLayout borderLayout1 = new BorderLayout();
  20. ...
  21. }



例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. public static final String TITLE = "RotPad";
  11. public static final String VERSION = "1.0";
  12. // Private constants
  13. private static final String TRANSFORM_ROT13 = "ROT13";
  14. private static final String TRANSFORM_ROT13N5 = "ROT13N5";
  15. private static final String TRANSFORM_ROTASCII = "ROT-ASCII";
  16. // GUI components [JBuilder generated]
  17. private BorderLayout borderLayout1 = new BorderLayout();
  18. private JPanel jPanel1 = new JPanel();
  19. private JPanel jPanel2 = new JPanel();
  20. ...
  21. /**
  22. * Construct a new instance of this class.
  23. */
  24. public RotPad() {
  25. ...
  26. }
  27. /**
  28. * Initialize UI components. [JBuilder generated]
  29. */
  30. private void jbInit() throws Exception {
  31. ...
  32. }
  33. ...
  34. //--------------------------------------------------------------------------
  35. /**
  36. * Start the application.
  37. */
  38. public static void main(String[] args) {
  39. ...
  40. }
  41. }



域声明


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

public常量(final和static 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. * Indicates that a customer was selected; returned by showDialog() when
  12. * user clicks select button.
  13. */
  14. public static final RESULT_SELECT = 1;
  15. private Vector results = new Vector(); // Search results.
  16. private DefaultTableModel tableModel = new DefaultTableModel(); // Grid model.
  17. // GUI fields. [JBuilder]
  18. private JLabel firstNameLabel = new JLabel();
  19. private JLabel lastNameLabel = new JLabel();
  20. // ...
  21. }



方法声明


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


总是要有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. * Calculate the consumption coefficient.
  9. */
  10. public float calculateConsumptionCoefficient(int base, float variance,
  11. int iterations) throws RangeException {
  12. // ...
  13. }
  14. /**
  15. * Calculate the consumption coefficient.
  16. */
  17. public float calculateConsumptionCoefficient(
  18. int base,
  19. float variance,
  20. int iterations)
  21. throws RangeException
  22. {
  23. // ...
  24. }
  25. /**
  26. * Calculate the consumption coefficient.
  27. */
  28. public float calculateConsumptionCoefficient(int base,
  29. float variance,
  30. int iterations)
  31. throws RangeException
  32. {
  33. // ...
  34. }



结论


至于结论,在关于编码风格的主题上,我有一个最终的想法告诉你。无论你遵守怎样的原则,也无论你关于一些事情比如缩进风格(参看, Raymond, "Indent Style")的信仰是如何强烈,你要记住的是当你编写代码的时候你总的目标应该是让代码在别人眼里看起来是可以理解和可以维护的。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/374079/viewspace-130850/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-08-23

  • 博文量
    1714
  • 访问量
    1477746