主要参考了阿里巴巴开发规范,特此说明java
整体原则是: 对外接口必须写;内部接口不建议使用 ,若是名字已经能够解释其意义,则不须要加注释,若是不能解释则能够加数据库
1)属性注释设计模式
/** xxx **/
private
String name;
public
void
setName(String name){
//xxx
do
();
}
1)类的成员顺序:public > private > final > static > 实例成员;类结构:成员 > 构造方法 > 静态方法 > 实例方法api
说明:一般使用者会更关注public 属性/方法缓存
public
class
User{
public
final
static
String key1=
'key1'
;
public
static
String key2=
"key2"
;
public
String key3=
"key3"
;
private
String key4=
"key4"
;
public
User(){
}
public
static
void
setKey3(String key3){
}
public
void
setKey4(String key4){
}
private
void
foo(){
}
}
2)列限制:200,尽可能在一行显示完整,超出须要换行,换行时遵循以下原则:数据结构
a 第二行相对第一行缩进 4 个空格,从第三行开始,再也不继续缩进,参考示例。
b 运算符与下文一块儿换行。
c 方法调用的点符号与下文一块儿换行。并发
sb.append(
"zi"
).append(
"xin"
)...
.append(
"huang"
)...
.append(
"huang"
)...
.append(
"huang"
);
d 在多个参数超长,逗号后进行换行。
e 在括号前不要换行,以下反例app
method(args1, args2, args3, ...
,argsX);
public
static
String name;
private
int
id;
public
void
method1(){
}
public
void
method2(){
}
不能使用拼音进行命名,统一使用准确的英文进行命名框架
不采用简写方式命名(除公认的经常使用简写,或公司/小组字典表有描述)。命名过长比不能理解更好异步
1)、包名
2)、接口与类的命名
接口不要以 I 开头。如:IUserService,而直接采用具体的命名方式如UserService
3)、抽象类命名
抽象类命名使用:Abstract+名词的方式进行命名,如:AbstractMessage
4)、实现类命名
a 基于 SOA 的理念,暴露出来的服务必定是接口,内部的实现类用 Impl 的后缀与接口区别。例如UserServiceImpl
b 对于只有一个实现类的状况(外部接口除外),一般先不采用接口方式,直接采用实现类便可
c 若是有多个实现类,则采用名称+抽象名称+Impl,如UserMessageImpl、AdminMessageImpl
5)、变量命名
a 全部变量(描述状态的除外)统一以准确的名词性英文命名,名词性英文语法以下:
b 描述状态的变量统一以准确的形容词性英文命名,形容词性英文语法以下:
c 对于反映状态的变量,不要在命名前面加“is”,由于自动生成的get方法,对于boolean值,方面名自动会变为is***
常量用全大写,单词之间用“_”分割,如:
public
static
final
String QUERYCLUBMEMBER_HQL=”…”;
d 对于成员变量,其名称可省略所属类的名称,如:
public
class
User {
private
String userName;
//NOT GOOD
private
String name;
//GOOD
}
接口类中的方法和属性不要加任何修饰符号 (public 也不要加 ,保持代码的简洁性)
public
interface
UserDao {
int
createUser(User user);
//NOT GOOD
int
create(User user);
//GOOD
}
接口、类的命名约定
类名
|
命名
|
示例
|
---|---|---|
Controller类 | **Controller | OrderController |
DAO层 | **Dao | UserDao |
Entity(领域对象) | 实体名 | User |
Interceptor类 | **Interceptor | AuthenticationInterceptor |
Servlet Filter类 | **Filter | ApplicationContextFilter |
Servlet类 | **Servlet | SystemInitServlet |
VO/DTO(视图对象) | 实体名+VO | UserVO |
工具类命名 | ***Util | DateUtil |
系统监控器类 | **Monitor | MemcachedMonitor |
逻辑层类 | **Service | UserService |
b POJO 类命名约定
POJO类包含了Entity、VO。POJO 类中布尔类型的变量,都不要加 is ,不然部分框架解析会引发序列化错误。
c 常规方法的命名约定
方法名
|
示例
|
批量
|
备注
|
---|---|---|---|
列表 | list***(复数) listUsers | - | 若是返回为空,则返回size=0的list,不能返回null |
建立 | create*** create createUser | batchCreate**s batchCreateUsers | |
删除 | delete** delete deleteUser | batchDelete**s batchDeleteUsers | |
更新 | update** update updateUser | batchUpdate**s batchUpdateUsers | |
统计 | count*** | batchCount*** | |
获取单个对象 | get** get getUser | batchGet**s batchGetUsers | |
获取单个对象根据某个参数 | getBy** getByName | - |
说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
7)、控制语句
a 在一个 switch 块内,每一个 case 要么经过 break / return 等来终止,要么注释说明程序将继续执行到哪个 case 为止 ; 在一个 switch 块内,都必须包含一个 default 语句而且放在最后,即便它什么代码也没有。
b 在 if / else / for / while / do 语句中必须使用大括号,即便只有一行代码,避免使用下面的形式: if (condition) statements;
c 推荐尽可能少用 else , if - else 的方式能够改写成:
if
(condition) {
...
return
obj;
}
boolean
existed = (file.open(fileName,
"w"
) !=
null
) && (...) || (...);
if
(existed) {
...
}
//NOT GOOD
public
int
insertUser() {
String name=request.get(
"name"
);
String password=request.get(
"password"
);
}
//GOOD
public
int
insertUser(String name,String password) {
}
public
class
TimerTaskThread
extends
Thread {
public
TimerTaskThread() {
super
.setName(
"TimerTaskThread"
); ...
}
一、不超过100行
二、嵌套层次不超过3层
例如if else try for while等这些控制代码的层次不能过深,不然可读性将会变得不好。尽可能保持平级,尽早返回或跳出。
三、一个函数不超过2个功能的具体代码,能够是引用
若是函数内有多个功能的具体代码,会形成临时变量过多,而且这些变量大可能是无相关的。会形成命名困难与容易引用变量出错。