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

Java 程序编码规范

来源:图灵教育
时间:2024-02-22 14:39:33

  所有的程序开发手册都包含各种规则。一些习惯性的自由程序员可能不适应这些规则,但当多个开发人员一起写作时,这些规则是必要的。这不仅是为了开发效率,也是为了以后的维护。

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

  byte[]buffer; 而不是: bytebuffer[]; 方法的参数 使用有意义的参数命名,如有可能,使用与要赋值的字段相同的名称: SetCounter(intsize){ this.size=size; } Java文件样式 所有Java(*.java)文件必须遵守以下样式规则 版权信息 Java文件的开头必须有版权信息,例如: /** *Copyright®2000年ShanghaiXXCon.Ltd. *Allrightreserved. */ javadoc中不需要出现的其他信息也可以包含在这里。 Package/Imports 在import行之前,import中的标准包名应在本地包名之前,并按字母顺序排列。如果import行包含同一包中的不同子目录,则应使用*进行处理。 packagehotlava.net.stats; importjava.io.*; importjava.util.Observable; importhotlava.util.Application; java在这里.io.*替换InputStreamandOutPutStream的用途。

  Class 下一步是类注释,通常用于解释类注释。 /** *Aclassrepresentingasetofpacketandbytecounters *Itisobservabletoallowittobewatched,butonly *reportschangeswhenthecurrentsetiscomplete */ 接下来是类定义,包括不同行的extends和implements publicclassCounterSet extendsObservable implementsCloneable ClassFields 接下来是类成员变量: /** *Packetcounters */ protectedint[]packets; public的成员变量必须生成文档(JavaDoc)。proceted、如果名字含义明确,private和package定义的成员变量可以不注释。 存取方法 接下来是类变量的访问方法。

  它只是用来赋值类变量的获取值,可以简单地写在一行上。 /** *Getthecounters *@returnanarraycontainingthestatisticaldata.Thisarrayhasbeen *freshlyallocatedandcanbemodifiedbythecaller. */ publicint[]getPackets(){returncopyArray(packets,offset);} publicint[]getBytes(){returncopyArray(bytes,offset);} publicint[]getPackets(){returnpackets;} publicvoidsetPackets(int[]packets){this.packets=packets;} 不要把其他方法写在一行上 构造函数 接下来是构造函数,它应该以递增的方式写(比如后面写的参数多)。 访问类型(”public","private"等.)和任何"static","final"或"synchronized“方法和参数应该在一行中另写一行,这样方法和参数才能更容易读懂。 public CounterSet(intsize){ this.size=size; } 克隆方法 如果这一类可以克隆,那么下一步就是clone: public Objectclone(){ try{ CounterSetobj=(CounterSet)super.clone(); obj.packets=(int[])packets.clone(); obj.size=size; returnobj; }catch(CloneNotSupportedExceptione){ thrownewInternalError("UnexpectedCloneNotSUpportedException:"+e.getMessage()); } } 类方法 下面开始写类的方法: /** *Setthepacketcounters *(suchaswhenrestoringfromadatabase) */ protectedfinal voidsetArray(int[]r1,int[]r2,int[]r3,int[]r4) throwsIllegalArgumentException { // //Ensurethearraysareofequalsize // if(r1.length!=r2.length ||r1.length!=r3.length|.length!=r4.length) thrownewIllegalArgumentException("Arraysmustbeofthesamesize"); System.arraycopy(r1,0,r3,0,r1.length); System.arraycopy(r2,0,r4,0,r1.length); } tostring方法 无论如何,tostring方法应定义为每个类: public StringtoString(){ Stringretval="CounterSet:"; for(inti=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中调用外,不应该在其他地方调用。下面的例子解释了错误和正确的用法: if((I)=(42){/错误-括号毫无意义 if(I==42)or(J==42)then//正确-真的需要括号 编程规范 exit() exit除了可以在main中调用外,不应该在其他地方调用。因为这样做不会给任何代码机会截获退出。

  一个类似的后台服务地程序不应该因为某个库模块决定退出而退出。 异常 申报错误应抛出RuntimeException或衍生异常。 顶层的main()函数应截获所有异常,并在屏幕上打印(或记录在日志中)。 垃圾收集 JAVA采用成熟的后台垃圾收集技术代替引用计数。但这会导致一个问题:你必须在使用对象的例子后清理场地。例如,prel程序员可能会这样写: ... { FileOutputStreamfos=newFileOutputStream(projectFile); project.save(fos,"IDEProjectFile"); } ... 非引用计数的程序语言,除非输出流一出作用域就关闭,例如,JAVA不能自动完成变量清场工作。必须像下面一样写: FileOutputStreamfos=newFileOutputStream(projectFile); project.save(fos,"IDEProjectFile"); fos.close(); Clone 以下是一种有用的方法: implementsCloneable public Objectclone() { try{ ThisClassobj=(ThisClass)super.clone(); obj.field1=(int[]field1.clone(); obj.field2=field2; returnobj; }catch(CloneNotSupportedExceptione){ thrownewInternalError("UnexpectedCloneNotSUpportedException:"+e.getMessage()); } } final类 不要因为性能而将类别定义为final(除非程序的框架要求) 如果一个类别还没有准备好被继承,最好在类文档中注明,而不是将她定义为final。这是因为没有人能保证因为什么原因需要继承她。这是因为没有人能保证因为什么原因需要继承她。 访问类成员变量 大多数类成员变量应定义为protected,以防止继承类使用。 注意“使用”int[]packets",而不是"intpackets[]",永远不要使用后者。 publicvoidsetPackets(int[]packets){this.packets=packets;} CounterSet(intsize) { this.size=size; } 编程技巧 byte数组转换为characters 为了将byte数组转换为characters,你可以这样做: "Helloworld!".getBytes(); Utility类 Utility类(仅提供方法的类)应被认为是抽象的,以防止被继承或初始化。".getBytes(); Utility类 Utility类(仅提供方法的类)应被认为是抽象的,以防止被继承或初始化。 初始化 下表面代码是初始化数组的好方法: objectArguments=newObject[]{arguments}; 枚举类型 JAVA不支持枚举,但以下代码是一个非常有用的模板: classColour{ publicstaticfinalColourBLACK=newColour(0,0,0); publicstaticfinalColourRED=newColour(0xff,0,0); publicstaticfinalColourGREEN=newColour(0,0xff,0); publicstaticfinalColourBLUE=newColour(0,0,0xFF); publicstaticfinalColourWHITE=newColour(0xFF,0xFF,0xFF); } 该技术实现了RED,GREEN,BLUE等常量可以像其他语言的枚举类型一样使用。它们可以用‘==’操作符进行比较。它们可以用‘==’操作符进行比较。 但这种使用有一个缺陷:如果用户使用这种方法创建颜色BLACK newColour(0,0,0) 所以这是另一个对象,操作符会出错。她的equal()方法仍然有效。因此,该技术的缺陷最好在文档中注明,或者只在自己的包中使用。 Swing 避免使用AWT组件 AWT和Swing组件混合使用 如需将AWT组件与Swing组件混合使用,请小心使用。事实上,尽量不要把它们混合起来。

  滚动AWT组件 绝对不要使用JscrolPane来实现AWT组件的滚动。在滚动AWT组件时,必须使用AWTScrolpane组件。 在InternalFrame组件中避免使用AWT组件 尽量不要这样做,否则会有不可预测的后果。 Z-Order问题 Swing组件上总是显示AWT组件。小心使用包含AWT组件的POP-UP菜单,尽量不要这样使用。 调试 调试是软件开发的重要组成部分,存在于软件生命周期的各个部分。配置开关调试是最基本的。 一种常用的调试方法是使用PrintStream成员,在没有定义调试流的情况下为null。类别应定义debug方法来设置调试流。 性能 在编写代码时,应从头到尾考虑性能问题。这并不是说所有的时间都应该浪费在优化代码上,而是我们应该时刻提醒自己注意代码的效率。

  例如,如果我们没有时间实现一个有效的算法,我们应该在文档中记录下来,以便在将来有空的时候实现她。 并非所有人都同意在编写代码时优化性能。他们认为性能优化的问题应该在项目的后期考虑,即在程序轮廓实现后。 不必要的对象结构 不要在循环中构建和释放物体 使用Stringbuffer 在处理String时,尽量使用Stringbuffer类,Stringbuffer类是构成String类的基础。String类包装了Stringbuffer类,为开发人员提供了一个安全的接口(以更多的时间为代价)。当我们构建字符串时,我们应该使用stringbuffer来实现大部分工作,并在工作完成后将stringbuffer对象转换为所需的string对象。例如,如果一个字符串必须不断添加许多字符来完成结构,那么我们应该使用Stringbuffer对象和她的应用程序()方法。如果我们用String对象代替Stringbuffer对象,我们将花费大量不必要的时间来创建和释放对象的CPU。 避免过多使用synchronized关键字 避免不必要的使用关键字synchronized,必要时再使用她,这是避免死锁的好方法。 可移植性 borlandJbulider不喜欢synchronized这个关键词,如果你的断点位于这些关键词的作用域,你会发现在调试过程中到处跳动,让你不知所措。尽量不要使用,除非有必要。 换行 如果需要换行,尽量用println代替字符串。n"。 不要这样做: System.out.print("Hello,world!\n"); 要这样: System.out.println("Hello,world!"); 或者你构建一个带换行符的字符串,至少要这样: Stringnewline=System.getProperty("line.separator"); System.out.println("Helloworld"+newline); PrintStream PrintStream已被拒绝(deprecated)使用,用PrintWrite代替她。