强智科技JAVA编码规范.docx
- 文档编号:29221094
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:44
- 大小:106.22KB
强智科技JAVA编码规范.docx
《强智科技JAVA编码规范.docx》由会员分享,可在线阅读,更多相关《强智科技JAVA编码规范.docx(44页珍藏版)》请在冰豆网上搜索。
强智科技JAVA编码规范
强智科技开发规范
文档类别
编码规范
文档编号
1.0
版本号
名称
Java编码规范
湖南强智科技发展有限公司
2007年8月
本文档修改记录
日期
内容摘要
编制/修改
审核
2007-08-03
整理、合并形成文档
谢平
2009-07-22
修订
聂磊
目录
1前言5
1.1简介5
1.2目的5
1总体开发规范6
1.3源代码总体结构6
1.4页面目录结构8
1.5业务逻辑建模9
1)各层的开发规范9
2Java编码通用规则12
2.1文件命名13
2.1.1文件后缀13
2.1.2通用的文件名13
2.2命名规范13
2.2.1Package的命名14
2.2.2Class的命名14
2.2.3Class变量的命名14
2.2.4StaticFinal变量的命名14
2.2.5参数的命名14
2.2.6数组的命名14
2.2.7方法的参数14
2.3Java文件样式14
2.3.1版权信息15
2.3.2Package/Imports15
2.3.3Class15
2.3.4ClassFields15
2.3.5存取方法16
2.3.6构造函数16
2.3.7类方法16
2.3.8toString方法17
2.3.9main方法17
2.4代码编写格式17
2.4.1代码样式17
2.4.2文档化17
2.4.3缩进17
2.4.4页宽17
2.4.5{}对18
2.4.6括号18
2.5程序编写规范18
2.5.1exit()18
2.5.2垃圾收集18
2.5.3final类18
2.5.4访问类的成员变量19
2.5.5异常19
2.6编程技巧和性能优化19
2.6.1byte数组转换到characters19
2.6.2初始化19
2.6.3枚举类型19
2.6.4调试19
2.6.5性能20
2.6.6不必要的对象构造20
2.6.7使用StringBuffer对象20
2.6.8避免太多的使用synchronized关键字20
2.6.9换行20
2.6.10PrintStream20
2.6.11关于session20
3项目编码规则22
3.1命名规则22
3.1.1通用命名规则22
3.2文档和格式规则23
3.2.1通用规则23
3.2.2代码的表现风格:
24
3.2.3随后的文件头中包含24
3.2.4类和接口的段24
3.2.5类和接口的注释25
3.2.6成员方法的注释25
3.3编码风格例子25
附录1:
编码注意事项及常见问题30
附录2:
了解JavaDoc33
附录3:
语句和表达式的参照格式33
附录4:
参考文献35
1前言
1.1简介
本文档给出的规范及规则有助于提高Java程序的编码风格及结构。
代码质量的好坏关系到将来代码的维护、性能、可移植性等问题,文中指出了开发人员常犯的影响代码质量的错误,给出的规则供程序员使用以防止类似的错误发生,并减少将来用于程序诊断及优化的时间。
同时,良好的编码习惯有助于标准化程序的结构和编码风格,使源代码对于自己和别人都易读和易懂。
在开发周期中越早使用恰当的编码规定,将会最大程度的提高项目的生产率。
良好的编码习惯除了代码格式,详细的注释外,还应该包括使用有助于提高程序效率的编码方式。
本文档的另一个目的是引导新的程序员建立一个规范、良好的编码习惯。
规范的开发有助于提高源码的可读性,可维护性,对于提高项目的整体效率更是不可缺少的(尤其是团队开发)。
本文包括两部分,第一部分为Java编码通用规则,第二部分为针对本项目的建议规则及定义。
附录中为总结一些编程经验后提出的注意事项。
1.2目的
该规范的目的是让项目中所有的源代码和文档风格统一,看起来像一个人写的,增加代码可读性,减少项目组中因为换人或者人员流动所带来的损失。
(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)。
在让程序有良好的可读性的基础上,还要注意程序的执行效率。
1总体开发规范
1.3源代码总体结构
目录说明:
Øcomm.包:
公共开发框架包,所有公共开发框架均存放此处,注意该包属于公共开发框架类,不允许在任何应用系统中修改该包里面的任何代码;
⏹framework包:
公共框架应用程序包,所有对于公共框架中应用操作均放此处;
⏹generic包:
通用持久化接口包,持久化操作均放此处;
⏹servlet包:
所有通用的servlet均放此处;
⏹tag包:
所有公共标记解析类均存放此处;
⏹util包:
所有工具类均存放此处;
⏹web包:
所有通用的web相关类均存放此处;
Øtest包:
单个应用系统单元测试代码均存放此处;
Øjiaowu包:
教务管理应用系统代码均存放此处;
⏹bean包:
所有教务管理系统POJO对象均存放此处,可根据子系统不同划分不同包;
⏹business包:
所有教务管理系统业务逻辑接口均存放此处,可根据子系统不同划分不同包;
◆impl包:
所有教务管理系统业务逻辑接口实现均存放此处,可根据子系统不同划分不同包;
⏹web包:
所有教务管理系统web程序代码均存放此处,可根据子系统不同划分不同包;
◆action包:
所有教务管理系统action类均存放此处,可根据子系统不同划分不同包;
◆form包:
所有教务管理系统form类均存放此处,可根据子系统不同划分不同包;
Ø其他应用系统包:
按照jiaowu包存放方式划分包结构;
1.4页面目录结构
Øcss目录:
所有css文件均存放此处;
Øerror目录:
所有错误页面均存放此处;
Øframework目录:
框架页面均存放此处,任何情况下均不允许在子系统中更改此目录中的任何文件;
Øimage目录:
所有图片资源均存放此处;
Øinc目录:
页面中的公共包含文件均存放此处,如需要使用包含文件必须想项目负责人提出申请,不得自行增加inc中的文件;
Øjs目录:
所有公共的js文件均存放此处;
ØselectPage目录:
所有公共选择列表页面的jsp文件均存放此处,如需要增加选择列表必须向项目负责人提出申请,不得自行增加;
Øtemplate目录:
公共报表打印的模版目录,可根据不同子系统划分子目录;
ØWEB-INF目录:
⏹frameConf目录:
框架配置文件均存放此处;
⏹jiaowuConf目录:
教务管理系统配置文件均存放此处;
⏹qztag目录:
公共标签库均存放此处;
1.5业务逻辑建模
i.各层的开发规范
1.5.1.1业务逻辑层
每个业务逻辑类必需提供业务服务接口,该接口做为对应业务逻辑的声明,禁止在业务代码中直接调用具体实现类而不是接口。
对业务逻辑实现类的要求:
Ø业务逻辑不需要依赖框架的任何具体类或第三方类库的任何API,通常情况下每个业务对象应该是一个简单普通的JavaBean。
Ø如果该业务对象需要访问持久层,则需要注入m.generic.ISingleGenericDAO接口,通过setGenericDao方法注入接口,直接调用m.generic.ISingleGenericDAO接口进行持久层操作;
Ø对于业务级别的错误、用户操作错误等,必须抛出一个异常(未定义),该类型的异常会被webflow的异常侦听器获取,并进行统一的错误页面转向处理。
Ø如果业务对象执行过程中发生不可修复的异常,则必须将异常抛出,以便事务自动回滚。
1.5.1.2持久层
在本框架内,m.generic.ISingleGenericDAO是对业务层提供持久服务的唯一访问接口。
m.generic.ISingleGenericDAO是持久操作的核心接口,它抽象定义了项目开发中绝大多数的持久层操作;它是对持久层底层实现的完全抽象,无论是JDBC操作还是OR操作,开发人员都只需与该接口打交道,无需了解其底层实现。
目前框架的持久层底层采用Hibernate实现,但该接口并没有暴露任何具体的Hibernate相关API,保证客户端不会对具体的底层API藕合,因此,若有必要将来可以随时将底层替换为其它OR框架。
所有业务类在引用持久服务实例时,必须遵守“IOC”的相关原则——只对该接口引用并由外部注入其实例,除此之外,没有其它办法可以获得ISingleGenericDAO的具体实例。
对于事务方面,ISingleGenericDAO的所有实现均被要求保证是无事务的,所有事务控制必须提升到业务层或业务层的上一层,在本框架中,事务是通过AOP声明式拦截服务和编程式事务模板两种途径实现。
对于批量数据处理,鉴于处理逻辑的复杂多变性,建议直接采用JDBC处理,ISingleGenericDAO接口提供了执行SQL语句的方法,这些是当前线程相关的,所有事务控制均需要由自己控制,但不允许自行关闭Connection——事实上也无法关闭,所有资源均被框架统一管理。
对于SQL查询优化,ISingleGenericDAO的当前实现已经对分页查询SQL提供了透明重写机制,并且其重写策略是针对其不同数据库而采用不同的优化策略。
有关ISingleGenericDAO的具体内容,请参见JavaDoc。
对持久类编写要求:
✓每个持久类均有一个objectId字段,该字段代表的是该实体对象对应物理表的主键字段
✓每个持久类必需覆盖equals()和hashCode()方法,以下为实体类的覆盖代码:
publicbooleanequals(Objectother){
if(this==other)returntrue;
if(other==null)returnfalse;
if(!
(otherinstanceofCORPerson))returnfalse;
CORPersoncastOther=(CORPerson)other;
if(null==this.getObjectId()||null==castOther.getObjectId()){
returnfalse;
}
else{
return(this.getObjectId().equals(castOther.getObjectId()));
}
}
publicinthashCode(){
if(null==this.getObjectId())returnsuper.hashCode();
intresult=17;
StringhashStr=getClass().getName();
result=37*result+(getObjectId()==null?
0:
getObjectId().intValue());
result=37*result+hashStr.hashCode();
returnresult;
}
✓所有持久类的关联字段必须设置lazy=”true”。
1.其它常用基础工具
ØBean处理类:
m.util.BeanUtil。
ØDES加密解密类:
m.util.DesEncrypter。
Ø字符串处理工具类:
m.util.StringUtils。
Ø文件工具类:
m.util.FileIO。
Ø标记库工具类:
m.util.TagUtils
2Java编码通用规则
1.Java源文件必须有“.java”扩展名
2.Java已编译的类文件必须有“.class”扩展名
3.每个Java源文件包含一个单一的publicclass或interface。
当privateclass及interface与publicclass相关联时,可将它们放在同一个源文件中作为publicclass。
publicclass应当是文件中的第一个class及interface。
Java源文件编写顺序:
●Beginningcomments
●Package及Importstatements
●Class和interfacedeclarations
4.每行代码避免超过80个字符。
5.当一个表达式在一行中写不下时,按如下规则换行:
●“逗号”后断开
●operator前断开
●新行中表达式的起点与前一行左对齐。
●如果上法使右边空余太少,可只缩进四个空格开始新行。
6.在同一行中不要放不同的types
7.最好在declarelocalvariables的地方即做localvariables的初始化。
(唯一的例外是:
如果初始值是先由其他计算得出的的时候,不在declare的地方做变量初始化)。
8.在同一个innerblock中不要declare相同的变量名称。
9.当编写class及interface时,须遵循下述的格式规则:
●在amethodname和"("开始的参数列表之间不能有空格。
.
●在declarationstatement下面一行的起始处加open“{”
●以close“}”开始的行与open“{”相匹配。
当出现一个nullstatement时,“{”之后紧跟“}”
10.每行最多包括一个“statement”.
11.“IFstatements”使用“{}”.
12.uniguqpackage的前缀组成均为小写的ASCII字符,并且应是最上层的域名之一。
例如:
com,edu等等
13.Classname应该尽量是名词,第一个字母大写(全名大小写混合)。
Classname应该简单,描述性强。
避免使用缩写。
14.Interface的命名同Class。
15.Methods应该是动词,第一个字母小写,每个中间单词的第一个字母大写。
16.除变量外,所有的instance,class及classconstants均是大小写混写(第一个字母小写,中间单词的第一个字母大写)变量名称不能以下划线“_”或”$”字符开头,变量名称应简短且语义清晰。
避免出现只有一个字符的变量名。
17.Classconstans和ANSIconstants类型的变量名称应全部大写,且字母间用下划线”_”隔开。
(尽量避免使用ANSIconstants以利于程序诊断)
18.不要随意将任何instance或class变量公有化(public)。
19.避免用一个object存取一个class(静态)变量或method。
可使用一个classname代替。
20.除了-1,0和1,可作为for循环中的计数器外,数字常数(文字形的)不应该直接编码。
21.在一个statement中避免将多个变量赋同一个值。
22.不要将赋值符号(assignment)放在易于等号(equality)混淆的地方。
23.不要为了提高实时性能而使用embeddedassignments。
2.1文件命名
本部分列出了常用的文件后缀及命名
2.1.1文件后缀
Java程序使用如下的文件后缀:
Java源程序.java
Java编译过的二进制文件.class
2.1.2通用的文件名
通用的类名(文件)包括:
IXXXX——强调该类是XXXX接口的类名.
XXXXImpl——强调实现了XXXX接口的类名.
XXXXSupport——为了减少过多的接口实现,实现了XXXX接口的类名.
2.2命名规范
所有命名必须是有意义的单词组合而成,一般情况下,单词应为全拼,不能缩写,除非缩写是被公认的。
不允许有汉语拼音或汉语拼音简写。
2.2.1Package的命名
Package的名字应该都是由一个小写单词组成。
比如:
packagecom.qzdatasoft.sws.business;
说明:
包名的第一段为com,第二段一般为公司缩写qzdatasoft,第三段为该子模块的名称sws,第四段为具体该包的作用business;该包为qzdatasoft公司sws模块的business包;
packagem;
说明:
该包为qzdatasoft公司的公用comm包;
2.2.2Class的命名
Class的名字由小写字母开头后面的单词用大写字母开头,如果该类是针对某个表或者视图等对象的操作类,最后一个单词必须申明该对象的类型。
比如:
publicclasscontentInfo
implementsSerializable{
……
}
2.2.3Class变量的命名
变量的名字必须用一个小写字母开头。
后面的单词用大写字母开头。
比如:
loginActionFormloginActionForm=(loginActionForm)actionForm;
2.2.4StaticFinal变量的命名
StaticFinal变量的名字应该都大写,并且指出完整含义。
publicstaticfinalStringTABLENAME="userInfo";//用户信息表表名
2.2.5参数的命名
参数的名字必须和变量的命名规范一致。
不过在一些必要的地方可以在参数名前面加上该参数的类型以示区别,比如:
StringstrSql="";
IntegerlUserId;
2.2.6数组的命名
数组应该总是用下面的方式来命名:
byte[]buffer;
而不是:
bytebuffer[];
2.2.7方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
setCounter(intsize){
this.size=size;
}
2.3Java文件样式
所有的Java(*.java)文件都必须遵守如下的样式规则:
2.3.1版权信息
版权信息必须在java文件的开头,比如:
/**
*说明:
*编写:
*日期:
2007-08-03
*湖南强智科技发展有限公司版权所有
*/
其他不需要出现在javadoc的信息也可以包含在这里。
2.3.2Package/Imports
package行要在import行之前,import中标准的包名要在本地的包名之前,而且按照字母顺序排列。
使用包的全名而不是通配符,这样可以便于理解,提供上下文的内容。
package.stats;
importjava.io.Serializable;//正确
importjava.sql.Connection;
importjava.util.Enumeration;
importjava.util.Vector;
importjavax.ejb.CreateException;
importjavax.ejb.DuplicateKeyException;
importjavax.ejb.EJBException;
importjava.io.*;//不提倡
importjava.sql.*;
importjava.util.*;
importjavax.ejb.*;
2.3.3Class
接下来的是类的注释,一般是用来解释类的。
/**
*
Title:
*
Description:
*
Copyright:
Copyright(c)2007
*
Company:
湖南强智科技发展有限公司
*@version1.0
*/
接下来是类定义,包含了在不同的行的extends和implements
publicclassCounterSet
extendsObservable
implementsCloneable
2.3.4ClassFields
接下来是类的成员变量:
/**
*Packetcounters
*/
protectedint[]packets;
public的成员变量必须生成文档(JavaDoc)。
proceted、private和package定义的成员变量如果名字含义明确的话,可以没有注释。
2.3.5存取方法
接下来是类变量的存取的方法。
它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
/**
*Getthecounters
*@returnanarraycontainingthestatisticaldata.Thisarrayhasbeen
*freshlyallocatedandcanbemodifiedbythecaller.
*/
publicint[]getPackets(){returncopyArray(packets,offset);}
publicint[]getBytes(){returncopyArray(bytes,offset);}
publicint[]getPackets(){returnpackets;}
publicvoidsetPackets(int[]packets){this.packets=packets;}
其它的方法不要写在一行上;
2.3.6构造函数
接下来是构造函数,它应该用递增的方式写(比如:
参数多的写在后面)。
访问类型("public","private"等.)和任何"static","final"或"synchronized"应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
publicCounterSet(intsize){
this.size=size;
}
2.3.7类方法
下面开始写类的方法:
/**
*validateUserName(Stringusername)
*检查用户名中是否含有非法字符
*@paramusernameString
*@retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 科技 JAVA 编码 规范
![提示](https://static.bdocx.com/images/bang_tan.gif)