当前位置: 首页 > 图灵资讯 > 技术篇> Java 程序编码规范

Java 程序编码规范

来源:图灵教育
时间:2024-02-25 14:01:16

命名规范 定义本规范的目的是使项目中的所有文件看起来像一个人写的文件,增加可读性,减少项目组更换造成的损失。(这些规范不一定要绝对遵守,但程序必须具有良好的可读性) Package 的命名 Package 名字应该由一个小写单词组成。 Class 的命名 Class 名字必须从大写字母开始,其他字母都是小写的单词组成 Class 变量的命名 变量名必须从小写字母开始。后面的单词从大写字母开始。 Static Final 变量的命名 Static Final 变量名称应大写,并指出完整含义。 参数的命名 参数的名称必须与变量的命名规范一致。 数组的命名 数组应始终以以以下方式命名:

byte[] buffer; 而不是:

byte buffer[]; 方法的参数 使用有意义的参数命名,如有可能,使用与要赋值的字段相同的名称:

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

Java 文件样式 所有的 Java(*.java) 文件必须遵守以下样式规则 版权信息 版权信息必须存在 java 例如,文件的开头:

/** * Copyright ® 2000 Shanghai 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 接下来是类的注释,通常用于解释类。 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", "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 final void 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 != 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 使用的长度室有两个空间,然后使用 Format|Tabs to Spaces 菜单将 Tab 将其转换为空格。 页宽 页宽应设置为80字符. 源代码一般不超过这个宽度, 并导致无法完全显示, 但该设置也可以灵活调整. 任何情况下, 超长的句子应该在逗号或操作符后折叠. 一句句折行后, 两个字符应该比原来的句子缩进. {} 对 {} 中间的句子应单独作为一行. 例如, 下面的第一行是错误的, 第二行是对的:

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; }

编程技巧 byte 数组转换到 characters 为了将 byte 数组转换到 characters,您可以这样做: "Hello world!".getBytes(); Utility 类 Utility 类别(仅提供方法的类别)应被认为是抽象的,以防止被继承或初始化。 初始化 以下代码是初始化数组的好方法: objectArguments = new Object[] { arguments }; 枚举类型 JAVA 对枚举的支持不好,但以下代码是一个非常有用的模板:

class Colour { public static final Colour BLACK = new Colour(0, 0, 0); public static final Colour RED = new Colour(0xFF, 0, 0); public static final Colour GREEN = new Colour(0, 0xFF, 0); public static final Colour BLUE = new Colour(0, 0, 0xFF); public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF); } 该技术实现了RED, GREEN, BLUE 常量可以用作其他语言的枚举类型。 他们可以用 '==' 比较操作符。 他们可以用 '==' 比较操作符。 但这种使用有一个缺陷:如果用户使用这种方法来创建颜色 BLACK new Colour(0,0,0) 所以这是另一个对象,操作符会出错。她的 equal() 该方法仍然有效。因此,该技术的缺陷最好在文档中注明,或者只在自己的包中使用。

Swing 避免使用 AWT 组件 混合使用 AWT 和 Swing 组件 如果要将 AWT 组件和 Swing 如果组件混合,请小心使用。事实上,尽量不要把它们混合起来。 滚动的 AWT 组件 AWT 绝对不要使用组件 JscrollPane 类实现滚动。滚动 AWT 必须使用组件 AWT ScrollPane 实现组件。 避免在 InternalFrame 组件中使用 AWT 组件 尽量不要这样做,否则会有不可预测的后果。 Z-Order 问题 AWT 总是显示组件 Swing 组件之上。当使用包含 AWT 组件的 POP-UP 菜单要小心,尽量不要这样用。

调试 调试是软件开发的重要组成部分,存在于软件生命周期的各个部分。最基本的调试可以通过配置打开和关闭。 一种常用的调试方法是使用一种 PrintStream 在没有定义调试流的情况下,类成员是 null,定义一个类别 debug 设置调试流的方法。

性能 在编写代码时,应从头到尾考虑性能问题。这并不是说所有的时间都应该浪费在优化代码上,而是我们应该时刻提醒自己注意代码的效率。例如,如果我们没有时间实现一个有效的算法,我们应该在文档中记录下来,以便在将来有空的时候实现她。 并非所有人都同意在编写代码时优化性能。他们认为性能优化的问题应该在项目的后期考虑,即在程序轮廓实现后。 不必要的对象结构 不要在循环中构建和释放物体 使用 StringBuffer 对象 在处理 String 尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类包装为开发人员提供了一个安全的接口(以花费更多的时间为代价)。当我们构建字符串时,我们应该使用 StringBuffer 为了实现大部分工作,工作完成后就会完成 StringBuffer 对象再次转换为需要的 String 对象。例如,如果一个字符串必须不断地添加许多字符来完成结构,那么我们应该使用它 StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替 StringBuffer 对象将花费大量不必要的创建和释放对象 CPU 时间。 避免使用过多 synchronized 关键字 避免使用不必要的关键字 synchronized,必要时使用她,这是避免死锁的好方法。

可移植性 Borland Jbulider 不喜欢 synchronized 这个关键词,如果你的断点位于这些关键词的作用域,你会发现在调试过程中到处跳动,让你不知所措。尽量不要使用,除非有必要。 换行 如果需要换行,尽量用 println 用“\”代替字符串n"。 不要这样做: System.out.print("Hello,world!\n"); 要这样: System.out.println("Hello,world!"); 或者你构建一个带有换行符的字符串,至少要这样: String newline = System.getProperty("line.separator"); System.out.println("Hello world" + newline); PrintStream PrintStream 已经不赞成了(deprecated)使用,用 PrintWrite 来代替她。