⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java 程序编码规范.htm

📁 写给JSP初级程序员的书
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<BODY bgColor=#ffffff text=#000000>
<table>
  <TBODY>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>Java 程序编码规范 <BR><FONT 
      size=2> 
      </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>命名规范&nbsp;<BR>定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)&nbsp;<BR><BR><BR>Package&nbsp;的命名&nbsp;<BR>Package&nbsp;的名字应该都是由一个小写单词组成。&nbsp;<BR>Class&nbsp;的命名&nbsp;<BR>Class&nbsp;的名字必须由大写字母开头而其他字母都小写的单词组成&nbsp;<BR>Class&nbsp;变量的命名&nbsp;<BR>变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。&nbsp;<BR>Static&nbsp;Final&nbsp;变量的命名&nbsp;<BR>Static&nbsp;Final&nbsp;变量的名字应该都大写,并且指出完整含义。&nbsp;<BR>参数的命名&nbsp;<BR>参数的名字必须和变量的命名规范一致。&nbsp;<BR>数组的命名&nbsp;<BR>数组应该总是用下面的方式来命名:&nbsp;<BR><BR>byte[]&nbsp;buffer;<BR><BR>&nbsp;<BR>而不是:&nbsp;<BR><BR>byte&nbsp;buffer[];<BR><BR>&nbsp;<BR><BR>方法的参数&nbsp;<BR>使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:&nbsp;<BR><BR>SetCounter(int&nbsp;size){<BR>this.size&nbsp;=&nbsp;size;<BR>}<BR><BR>&nbsp;<BR><BR><BR>Java&nbsp;文件样式&nbsp;<BR>所有的&nbsp;Java(*.java)&nbsp;文件都必须遵守如下的样式规则&nbsp;<BR><BR><BR>版权信息&nbsp;<BR>版权信息必须在&nbsp;java&nbsp;文件的开头,比如:&nbsp;<BR><BR>/**<BR>&nbsp;*&nbsp;Copyright&nbsp;&reg;&nbsp;2000&nbsp;Shanghai&nbsp;XXX&nbsp;Co.&nbsp;Ltd.<BR>&nbsp;*&nbsp;All&nbsp;right&nbsp;reserved.<BR>&nbsp;*/<BR><BR>&nbsp;<BR>其他不需要出现在&nbsp;javadoc&nbsp;的信息也可以包含在这里。<BR><BR><BR>Package/Imports&nbsp;<BR>package&nbsp;行要在&nbsp;import&nbsp;行之前,import&nbsp;中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果&nbsp;import&nbsp;行中包含了同一个包中的不同子目录,则应该用&nbsp;*&nbsp;来处理。&nbsp;<BR><BR>package&nbsp;hotlava.net.stats;<BR><BR>import&nbsp;java.io.*;<BR>import&nbsp;java.util.Observable;<BR>import&nbsp;hotlava.util.Application;<BR><BR>&nbsp;<BR>这里&nbsp;java.io.*&nbsp;使用来代替InputStream&nbsp;and&nbsp;OutputStream&nbsp;的。<BR><BR><BR>Class&nbsp;<BR>接下来的是类的注释,一般是用来解释类的。&nbsp;<BR><BR>/**<BR>&nbsp;*&nbsp;A&nbsp;class&nbsp;representing&nbsp;a&nbsp;set&nbsp;of&nbsp;packet&nbsp;and&nbsp;byte&nbsp;counters<BR>&nbsp;*&nbsp;It&nbsp;is&nbsp;observable&nbsp;to&nbsp;allow&nbsp;it&nbsp;to&nbsp;be&nbsp;watched,&nbsp;but&nbsp;only<BR>&nbsp;*&nbsp;reports&nbsp;changes&nbsp;when&nbsp;the&nbsp;current&nbsp;set&nbsp;is&nbsp;complete<BR>&nbsp;*/<BR><BR>&nbsp;<BR>接下来是类定义,包含了在不同的行的&nbsp;extends&nbsp;和&nbsp;implements&nbsp;<BR><BR>public&nbsp;class&nbsp;CounterSet<BR>extends&nbsp;Observable<BR>implements&nbsp;Cloneable<BR><BR>&nbsp;<BR><BR>Class&nbsp;Fields&nbsp;<BR>接下来是类的成员变量:&nbsp;<BR><BR>/**<BR>&nbsp;*&nbsp;Packet&nbsp;counters<BR>&nbsp;*/<BR>protected&nbsp;int[]&nbsp;packets;<BR><BR>&nbsp;<BR>public&nbsp;的成员变量必须生成文档(JavaDoc)。proceted、private和&nbsp;package&nbsp;定义的成员变量如果名字含义明确的话,可以没有注释。<BR><BR><BR>存取方法&nbsp;<BR>接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。&nbsp;<BR><BR>/**<BR>&nbsp;*&nbsp;Get&nbsp;the&nbsp;counters<BR>&nbsp;*&nbsp;@return&nbsp;an&nbsp;array&nbsp;containing&nbsp;the&nbsp;statistical&nbsp;data.&nbsp;&nbsp;This&nbsp;array&nbsp;has&nbsp;been<BR>&nbsp;*&nbsp;freshly&nbsp;allocated&nbsp;and&nbsp;can&nbsp;be&nbsp;modified&nbsp;by&nbsp;the&nbsp;caller.<BR>&nbsp;*/<BR>public&nbsp;int[]&nbsp;getPackets()&nbsp;{&nbsp;return&nbsp;copyArray(packets,&nbsp;offset);&nbsp;}<BR>public&nbsp;int[]&nbsp;getBytes()&nbsp;{&nbsp;return&nbsp;copyArray(bytes,&nbsp;offset);&nbsp;}<BR><BR>public&nbsp;int[]&nbsp;getPackets()&nbsp;{&nbsp;return&nbsp;packets;&nbsp;}<BR>public&nbsp;void&nbsp;setPackets(int[]&nbsp;packets)&nbsp;{&nbsp;this.packets&nbsp;=&nbsp;packets;&nbsp;}<BR><BR>&nbsp;<BR>其它的方法不要写在一行上<BR><BR><BR>构造函数&nbsp;<BR>接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。&nbsp;<BR>访问类型&nbsp;("public",&nbsp;"private"&nbsp;等.)&nbsp;和&nbsp;任何&nbsp;"static",&nbsp;"final"&nbsp;或&nbsp;"synchronized"&nbsp;应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。&nbsp;<BR><BR>public<BR>CounterSet(int&nbsp;size){<BR>&nbsp;&nbsp;this.size&nbsp;=&nbsp;size;<BR>}<BR><BR>&nbsp;<BR><BR>克隆方法&nbsp;<BR>如果这个类是可以被克隆的,那么下一步就是&nbsp;clone&nbsp;方法:&nbsp;<BR><BR>public<BR>Object&nbsp;clone()&nbsp;{<BR>&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CounterSet&nbsp;obj&nbsp;=&nbsp;(CounterSet)super.clone();<BR>&nbsp;&nbsp;&nbsp;&nbsp;obj.packets&nbsp;=&nbsp;(int[])packets.clone();<BR>&nbsp;&nbsp;&nbsp;&nbsp;obj.size&nbsp;=&nbsp;size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj;<BR>&nbsp;&nbsp;}catch(CloneNotSupportedException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InternalError("Unexpected&nbsp;CloneNotSUpportedException:&nbsp;"&nbsp;+&nbsp;e.getMessage());<BR>&nbsp;&nbsp;}<BR>}<BR><BR>&nbsp;<BR><BR>类方法&nbsp;<BR>下面开始写类的方法:&nbsp;<BR><BR>/**<BR>&nbsp;*&nbsp;Set&nbsp;the&nbsp;packet&nbsp;counters<BR>&nbsp;*&nbsp;(such&nbsp;as&nbsp;when&nbsp;restoring&nbsp;from&nbsp;a&nbsp;database)<BR>&nbsp;*/<BR>protected&nbsp;final<BR>void&nbsp;setArray(int[]&nbsp;r1,&nbsp;int[]&nbsp;r2,&nbsp;int[]&nbsp;r3,&nbsp;int[]&nbsp;r4)<BR>&nbsp;&nbsp;throws&nbsp;IllegalArgumentException<BR>{<BR>&nbsp;&nbsp;//<BR>&nbsp;&nbsp;//&nbsp;Ensure&nbsp;the&nbsp;arrays&nbsp;are&nbsp;of&nbsp;equal&nbsp;size<BR>&nbsp;&nbsp;//<BR>&nbsp;&nbsp;if&nbsp;(r1.length&nbsp;!=&nbsp;r2.length&nbsp;||&nbsp;r1.length&nbsp;!=&nbsp;r3.length&nbsp;||&nbsp;r1.length&nbsp;!=&nbsp;r4.length)<BR>throw&nbsp;new&nbsp;IllegalArgumentException("Arrays&nbsp;must&nbsp;be&nbsp;of&nbsp;the&nbsp;same&nbsp;size");<BR>&nbsp;&nbsp;System.arraycopy(r1,&nbsp;0,&nbsp;r3,&nbsp;0,&nbsp;r1.length);<BR>&nbsp;&nbsp;System.arraycopy(r2,&nbsp;0,&nbsp;r4,&nbsp;0,&nbsp;r1.length);<BR>}<BR><BR><BR>&nbsp;<BR><BR>toString&nbsp;方法&nbsp;<BR>无论如何,每一个类都应该定义&nbsp;toString&nbsp;方法:&nbsp;<BR><BR>public<BR>String&nbsp;toString()&nbsp;{<BR>&nbsp;&nbsp;String&nbsp;retval&nbsp;=&nbsp;"CounterSet:&nbsp;";<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;data.length();&nbsp;i++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retval&nbsp;+=&nbsp;data.bytes.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retval&nbsp;+=&nbsp;data.packets.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;retval;<BR>&nbsp;&nbsp;}<BR>}<BR><BR>&nbsp;<BR><BR>main&nbsp;方法&nbsp;<BR>如果main(String[])&nbsp;方法已经定义了,&nbsp;那么它应该写在类的底部.&nbsp;<BR><BR>代码编写格式&nbsp;<BR><BR><BR>代码样式&nbsp;<BR>代码应该用&nbsp;unix&nbsp;的格式,而不是&nbsp;windows&nbsp;的(比如:回车变成回车+换行)&nbsp;<BR>文档化&nbsp;<BR>必须用&nbsp;javadoc&nbsp;来为类生成文档。不仅因为它是标准,这也是被各种&nbsp;java&nbsp;编译器都认可的方法。使用&nbsp;@author&nbsp;标记是不被推荐的,因为代码不应该是被个人拥有的。&nbsp;<BR>缩进&nbsp;<BR>缩进应该是每行2个空格.&nbsp;不要在源文件中保存Tab字符.&nbsp;在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.&nbsp;<BR>如果你使用&nbsp;UltrEdit&nbsp;作为你的&nbsp;Java&nbsp;源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符,&nbsp;方法是通过&nbsp;UltrEdit中先设定&nbsp;Tab&nbsp;使用的长度室2个空格,然后用&nbsp;Format|Tabs&nbsp;to&nbsp;Spaces&nbsp;菜单将&nbsp;Tab&nbsp;转换为空格。&nbsp;<BR>页宽&nbsp;<BR>页宽应该设置为80字符.&nbsp;源代码一般不会超过这个宽度,&nbsp;并导致无法完整显示,&nbsp;但这一设置也可以灵活调整.&nbsp;在任何情况下,&nbsp;超长的语句应该在一个逗号或者一个操作符后折行.&nbsp;一条语句折行后,&nbsp;应该比原来的语句再缩进2个字符.&nbsp;<BR>{}&nbsp;对&nbsp;<BR>{}&nbsp;中的语句应该单独作为一行.&nbsp;例如,&nbsp;下面的第1行是错误的,&nbsp;第2行是正确的:&nbsp;<BR><BR>if&nbsp;(i&gt;0)&nbsp;{&nbsp;i&nbsp;++&nbsp;};&nbsp;//&nbsp;错误,&nbsp;{&nbsp;和&nbsp;}&nbsp;在同一行&nbsp;<BR><BR>if&nbsp;(i&gt;0)&nbsp;{&nbsp;<BR>i&nbsp;++&nbsp;<BR>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;正确,&nbsp;{&nbsp;单独作为一行&nbsp;<BR><BR><BR>}&nbsp;语句永远单独作为一行.&nbsp;<BR><BR>&nbsp;<BR>如果&nbsp;}&nbsp;语句应该缩进到与其相对应的&nbsp;{&nbsp;那一行相对齐的位置。<BR><BR><BR>括号&nbsp;<BR>左括号和后一个字符之间不应该出现空格,&nbsp;同样,&nbsp;右括号和前一个字符之间也不应该出现空格.&nbsp;下面的例子说明括号和空格的错误及正确使用:&nbsp;<BR><BR>CallProc(&nbsp;AParameter&nbsp;);&nbsp;//&nbsp;错误&nbsp;<BR>CallProc(AParameter);&nbsp;//&nbsp;正确&nbsp;<BR><BR>不要在语句中使用无意义的括号.&nbsp;括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:&nbsp;<BR><BR>if&nbsp;((I)&nbsp;=&nbsp;42)&nbsp;{&nbsp;//&nbsp;错误&nbsp;-&nbsp;括号毫无意义&nbsp;<BR>if&nbsp;(I&nbsp;==&nbsp;42)&nbsp;or&nbsp;(J&nbsp;==&nbsp;42)&nbsp;then&nbsp;//&nbsp;正确&nbsp;-&nbsp;的确需要括号&nbsp;<BR><BR><BR>程序编写规范&nbsp;<BR><BR><BR>exit()&nbsp;<BR>exit&nbsp;除了在&nbsp;main&nbsp;中可以被调用外,其他的地方不应该调用。因为这样做不给任何代码代码机会来截获退出。一个类似后台服务地程序不应该因为某一个库模块决定了要退出就退出。&nbsp;<BR>异常&nbsp;<BR>申明的错误应该抛出一个RuntimeException或者派生的异常。&nbsp;<BR>顶层的main()函数应该截获所有的异常,并且打印(或者记录在日志中)在屏幕上。&nbsp;<BR>垃圾收集&nbsp;<BR>JAVA使用成熟的后台垃圾收集技术来代替引用计数。但是这样会导致一个问题:你必须在使用完对象的实例以后进行清场工作。比如一个prel的程序员可能这么写:&nbsp;<BR><BR>...<BR>{<BR>FileOutputStream&nbsp;fos&nbsp;=&nbsp;new&nbsp;FileOutputStream(projectFile);<BR>project.save(fos,&nbsp;"IDE&nbsp;Project&nbsp;File");&nbsp;<BR>}<BR>...<BR><BR>&nbsp;<BR>除非输出流一出作用域就关闭,非引用计数的程序语言,比如JAVA,是不能自动完成变量的清场工作的。必须象下面一样写:&nbsp;<BR><BR>FileOutputStream&nbsp;fos&nbsp;=&nbsp;new&nbsp;FileOutputStream(projectFile);<BR>project.save(fos,&nbsp;"IDE&nbsp;Project&nbsp;File");&nbsp;<BR>fos.close();<BR><BR>&nbsp;<BR><BR>Clone&nbsp;<BR>下面是一种有用的方法:&nbsp;<BR><BR>&nbsp;&nbsp;implements&nbsp;Cloneable<BR><BR>&nbsp;&nbsp;public<BR>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;clone()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThisClass&nbsp;obj&nbsp;=&nbsp;(ThisClass)super.clone();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.field1&nbsp;=&nbsp;(int[])field1.clone();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.field2&nbsp;=&nbsp;field2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch(CloneNotSupportedException&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InternalError("Unexpected&nbsp;CloneNotSUpportedException:&nbsp;"&nbsp;+&nbsp;e.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;<BR><BR>final&nbsp;类&nbsp;<BR>绝对不要因为性能的原因将类定义为&nbsp;final&nbsp;的(除非程序的框架要求)&nbsp;<BR>如果一个类还没有准备好被继承,最好在类文档中注明,而不要将她定义为&nbsp;final&nbsp;的。这是因为没有人可以保证会不会由于什么原因需要继承她。&nbsp;<BR>访问类的成员变量&nbsp;<BR>大部分的类成员变量应该定义为&nbsp;protected&nbsp;的来防止继承类使用他们。&nbsp;<BR>注意,要用"int[]&nbsp;packets",而不是"int&nbsp;packets[]",后一种永远也不要用。&nbsp;<BR><BR>public&nbsp;void&nbsp;setPackets(int[]&nbsp;packets)&nbsp;{&nbsp;this.packets&nbsp;=&nbsp;packets;&nbsp;}<BR><BR>&nbsp;&nbsp;CounterSet(int&nbsp;size)<BR>{<BR>&nbsp;&nbsp;this.size&nbsp;=&nbsp;size;<BR>}<BR><BR>&nbsp;<BR><BR><BR>编程技巧&nbsp;<BR><BR><BR>byte&nbsp;数组转换到&nbsp;characters&nbsp;<BR>为了将&nbsp;byte&nbsp;数组转换到&nbsp;characters,你可以这么做:&nbsp;<BR><BR>"Hello&nbsp;world!".getBytes();&nbsp;<BR><BR><BR>Utility&nbsp;类&nbsp;<BR>Utility&nbsp;类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化。&nbsp;<BR><BR><BR>初始化&nbsp;<BR>下面的代码是一种很好的初始化数组的方法:&nbsp;<BR><BR>objectArguments&nbsp;=&nbsp;new&nbsp;Object[]&nbsp;{&nbsp;arguments&nbsp;};&nbsp;<BR><BR><BR>枚举类型&nbsp;<BR>JAVA&nbsp;对枚举的支持不好,但是下面的代码是一种很有用的模板:&nbsp;<BR><BR>class&nbsp;Colour&nbsp;{<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;Colour&nbsp;BLACK&nbsp;=&nbsp;new&nbsp;Colour(0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;Colour&nbsp;RED&nbsp;=&nbsp;new&nbsp;Colour(0xFF,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;Colour&nbsp;GREEN&nbsp;=&nbsp;new&nbsp;Colour(0,&nbsp;0xFF,&nbsp;0);<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;Colour&nbsp;BLUE&nbsp;=&nbsp;new&nbsp;Colour(0,&nbsp;0,&nbsp;0xFF);<BR>&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;Colour&nbsp;WHITE&nbsp;=&nbsp;new&nbsp;Colour(0xFF,&nbsp;0xFF,&nbsp;0xFF);<BR>}<BR><BR>&nbsp;<BR>这种技术实现了RED,&nbsp;GREEN,&nbsp;BLUE&nbsp;等可以象其他语言的枚举类型一样使用的常量。&nbsp;他们可以用&nbsp;'=='&nbsp;操作符来比较。&nbsp;<BR>但是这样使用有一个缺陷:如果一个用户用这样的方法来创建颜色&nbsp;BLACK&nbsp;<BR><BR>new&nbsp;Colour(0,0,0)&nbsp;<BR><BR>那么这就是另外一个对象,'=='操作符就会产生错误。她的&nbsp;equal()&nbsp;方法仍然有效。由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。&nbsp;<BR><BR>Swing&nbsp;<BR><BR><BR>避免使用&nbsp;AWT&nbsp;组件&nbsp;<BR>混合使用&nbsp;AWT&nbsp;和&nbsp;Swing&nbsp;组件&nbsp;<BR>如果要将&nbsp;AWT&nbsp;组件和&nbsp;Swing&nbsp;组件混合起来使用的话,请小心使用。实际上,尽量不要将他们混合起来使用。&nbsp;<BR><BR><BR>滚动的&nbsp;AWT&nbsp;组件&nbsp;<BR>AWT&nbsp;组件绝对不要用&nbsp;JscrollPane&nbsp;类来实现滚动。滚动&nbsp;AWT&nbsp;组件的时候一定要用&nbsp;AWT&nbsp;ScrollPane&nbsp;组件来实现。&nbsp;<BR><BR><BR>避免在&nbsp;InternalFrame&nbsp;组件中使用&nbsp;AWT&nbsp;组件&nbsp;<BR>尽量不要这么做,要不然会出现不可预料的后果。&nbsp;<BR><BR><BR>Z-Order&nbsp;问题&nbsp;<BR>AWT&nbsp;组件总是显示在&nbsp;Swing&nbsp;组件之上。当使用包含&nbsp;AWT&nbsp;组件的&nbsp;POP-UP&nbsp;菜单的时候要小心,尽量不要这样使用。&nbsp;<BR><BR><BR><BR>调试&nbsp;<BR><BR><BR>调试在软件开发中是一个很重要的部分,存在软件生命周期的各个部分中。调试能够用配置开、关是最基本的。&nbsp;<BR><BR>很常用的一种调试方法就是用一个&nbsp;PrintStream&nbsp;类成员,在没有定义调试流的时候就为&nbsp;null,类要定义一个&nbsp;debug&nbsp;方法来设置调试用的流。&nbsp;<BR><BR><BR><BR>性能&nbsp;<BR><BR><BR>在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。&nbsp;<BR><BR>不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。&nbsp;<BR>不必要的对象构造&nbsp;<BR>不要在循环中构造和释放对象&nbsp;<BR><BR><BR>使用&nbsp;StringBuffer&nbsp;对象&nbsp;<BR>在处理&nbsp;String&nbsp;的时候要尽量使用&nbsp;StringBuffer&nbsp;类,StringBuffer&nbsp;类是构成&nbsp;String&nbsp;类的基础。String&nbsp;类将&nbsp;StringBuffer&nbsp;类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用&nbsp;StringBuffer&nbsp;来实现大部分的工作,当工作完成后将&nbsp;StringBuffer&nbsp;对象再转换为需要的&nbsp;String&nbsp;对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用&nbsp;StringBuffer&nbsp;对象和她的&nbsp;append()&nbsp;方法。如果我们用&nbsp;String&nbsp;对象代替&nbsp;StringBuffer&nbsp;对象的话,会花费许多不必要的创建和释放对象的&nbsp;CPU&nbsp;时间。&nbsp;<BR><BR>避免太多的使用&nbsp;synchronized&nbsp;关键字&nbsp;<BR>避免不必要的使用关键字&nbsp;synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。&nbsp;<BR><BR>可移植性&nbsp;<BR>Borland&nbsp;Jbulider&nbsp;不喜欢&nbsp;synchronized&nbsp;这个关键字,如果你的断点设在这些关键字的作用域内的话,调试的时候你会发现的断点会到处乱跳,让你不知所措。除非必须,尽量不要使用。&nbsp;<BR><BR><BR>换行&nbsp;<BR>如果需要换行的话,尽量用&nbsp;println&nbsp;来代替在字符串中使用"\n"。&nbsp;<BR>你不要这样:&nbsp;<BR><BR>System.out.print("Hello,world!\n");&nbsp;<BR><BR>要这样:&nbsp;<BR><BR>System.out.println("Hello,world!");&nbsp;<BR><BR>或者你构造一个带换行符的字符串,至少要象这样:&nbsp;<BR><BR>String&nbsp;newline&nbsp;=&nbsp;System.getProperty("line.separator");&nbsp;<BR>System.out.println("Hello&nbsp;world"&nbsp;+&nbsp;newline);&nbsp;<BR><BR><BR>PrintStream&nbsp;<BR>PrintStream&nbsp;已经被不赞成(deprecated)使用,用&nbsp;PrintWrite&nbsp;来代替她。&nbsp;<BR><BR>参考资料<BR><BR>查找有关&nbsp;Thread&nbsp;类和&nbsp;Java&nbsp;2&nbsp;平台,标准版,API&nbsp;规范的其他方面的信息。&nbsp;<BR><BR>作者简介&nbsp;<BR><BR>李小敏<BR>www.yway.com&nbsp;软件工程师<BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -