java编码规范

来源:互联网 发布:数据库培训内容 编辑:程序博客网 时间:2024/06/08 02:22

1章 引言

1.1介绍

    本文档SUN的标准Java代码规范为基础,结合公司的实际需要做一些修改和补充,编写次文档的目的是规范公司开发代码,增加代码清晰度,减少bug,降低后期维护成本和代码审查,养成代码规范的习惯,便于开发人员自身成长。

 


第2章  标识符命名

注:所有标识符不能出现中文,尽量使用通俗英文,不可拼音和英文混用。


2.1 包名

全部使用小写字母单词间不要用字符隔开

正例:com.axj.batchfile

反例:com.axj.batch_file


2.2 类名


2.2.1 类命名

类名使用驼峰命名,每个自然语义的单词首字母大写,其他字母小写

正例:SendThread

反例:sendThreadSendthread


2.2.2 类后缀

类名不同的后缀代表不同的类型:

后缀名

意义

举例

 Exception

这个类是异常类

Axj Exception

Service

表明这个类是个服务类,里面包含了给其他类提同业务服务的方法

AccountService

Impl

这个类是一个实现类,AccountServiceImpl实现AccountService

AccountServiceImpl

Test

日常测试类,以测试名称开头,Test为后缀

CodeTest

Enum

这个类是枚举类,枚举成员名称需要全大写,单词间用下划线隔开

TimeEnum

Inter

这个类是一个接口

LifeCycleInter

Dao

这个类封装了数据访问方法,一般为接口

PaymentOrderDao

Action

直接处理页面请求,管理页面逻辑了类

UpdateOrderListAction

Listener

响应某种事件的类

PaymentSuccessListener

Event

这个类代表了某种事件

PaymentSuccessEvent

Servlet

一个Servlet

PaymentCallbackServlet

Factory

生成某种对象工厂的类

PaymentOrderFactory

Adapter

用来连接某种以前不被支持的对象的类

DatabaseLogAdapter

Job

某种按时间运行的任务

PaymentOrderCancelJob

Wrapper

这是一个包装类,为了给某个类提供没有的能力

SelectableOrderListWrapper

Bean

这是一个POJO

MenuStateBean

Thread

表示是线程类

SendThread

POJO

POJO 类中布尔类型的变量,都不要加 is ,否则部分框架解析会引起序列化错误

 

Abstract

抽象类最好能用“Abstract”做为类命名的开头(前缀)

AbstractBeanFactory


2.3方法名

首字母小写,后面自然语义的单词首字母都大写

正例:closeSession

反例:CloseSessionclosesession

动词在前,名词在后

正例:closeSession

反例:sessionClose

方法命名格式(方法名要准确表达业务的含义):

前缀名

意义

举例

create

创建

createOrder()

delete

删除

deleteOrder()

add

创建,暗示新创建的对象属于某个集合

addPaidOrder()

remove

删除

removeOrder()

init或则initialize

初始化,暗示会做些诸如获取资源等特殊动作

initializeObjectPool

destroy

销毁,暗示会做些诸如释放资源的特殊动作

destroyObjectPool

open

打开

openConnection()

close

关闭

closeConnection()<

read

读取

readUserName()

write

写入

writeUserName()

get

获得

getName()

set

设置

setName()

prepare

准备

prepareOrderList()

copy

复制

copyCustomerList()

modity

修改

modifyActualTotalAmount()

calculate

数值计算

calculateCommission()

do

执行某个过程或流程

doOrderCancelJob()

dispatch

判断程序流程转向

dispatchUserRequest()

start

开始

startOrderProcessing()

stop

结束

stopOrderProcessing()

send

发送某个消息或事件

sendOrderPaidMessage()

receive

接受消息或时间

receiveOrderPaidMessgae()

respond

响应用户动作

responseOrderListItemClicked()

find

查找对象

findNewSupplier()

update

更新对象

updateCommission()


2.4 变量、参数名

变量一定要清楚表达什么意思,一般取一些通俗有意义的名字,尽量使用简短英文单词。

命名规则:

1、首字母小写,后面自然语义的单词首字母都大写

2、只能以字母、“_”“$”符号作为变量名开头。

3、变量中可包含数字,但不能以数字开头。

4、除了“_”“$”符号以外,变量中不能包含其他特殊字符。

5、不能用classintStringpublicjava关键字做为变量名。

6、在java中变量名严格区分大小写,例如:nameName就是两个不同的变量

7、静态变量和枚举类型字母全大写,多个单词之间用”_”分隔,如:TIME_EVENT



第3章 代码注释


3.1 注释分类

注:注释主要分为2种,实现注释和文档注释。


3.1.1 实现注释

实现注释使用/*...*///界定,使用/*...*/来进行块注释使用//进行行注释位于注释代码上一行


3.1.2文档注释

文档注释描述Java的类、接口、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前javadocj2sdk里面一个非常重要的工具,如果你按照规范在Java的源代码里面写好注释的话,那么它就可以生成相应的文档便于开发者察看Myeclipse生成步骤,点击菜单栏的Project,选择generate javadoc下一步即可。

javadoc参数定义:

@author   对类的说明 标明开发该类模块的作者

@version   对类的说明 标明该类模块的版本

@see     对类、属性、方法的说明 参考转向,也就是相关主题

@param    对方法的说明 对方法中某参数的说明

@return   对方法的说明 对方法返回值的说明

@exception  对方法的说明 对方法可能抛出的异常进行说明


3.2 注释条件(必加)

1、类的注释

2、方法的注释

3、在代码复杂处注释

4、代码修改处注释上时间和修改原因

5、全局变量注释

6、在多重嵌套和循环逻辑上注释

7、接口注释

8、调用工具类中方法的注释


3.3 注释举例


3.3.1 类注释

/**

 *类功能概述×××××××

 *

 *@author huwei

 *@time 2017-8-20

 */

public class LogicManager {

......

}


3.3.2 方法注释

/**

 * 方法说明×××××××

 *

  * @param1 参数说明

 * @param2 参数说明

  * @return 返回值说明

  * @throws Exception

  */

public boolean executeLogic(int param1, int param2)throws Exception{

......

return true;

}


3.3.3 全局变量、字段、属性注释

public class ReadManager {

   /** 全局的计数变量*/

   private final int count;

   /** 字段/属性*/

   private String name;

}


3.3.4 代码域注释

            /*----------开始:解析数据库数据 ------- */

            //\1拆分数据库数据

            String Row[] = sStr.split("\1");

waitRecord = new WaitRecord[Row.length];

 

            /* 循环存储对象到List */

for (int i = 0; i < Row.length; i++) {

String Col[] = Row[i].split("\2");

waitRecord[i] = new WaitRecord();

waitRecord[i].waitId = Col[0];

waitRecord[i].userId = Col[1];

waitRecord[i].username = Col[2];

waitRecord[i].longId = Col[3];

                waitList.add(waitRecord[i]);

}

              /*----------结束:解析数据库数据 ------- */



第4章  编程实践


4.1 空行

空行一般用于分割特定区域代码,表达一段代码,总结为以下几种情况必须换行:

1、代码注释前得换行

 

2、两个方法之间换行

 


3、不同逻辑段之间

 

 

4、方法里的局部变量和第一条非局部变量代码之间

 

4.2 换行

1、一行代码最大不超过120字符,超过则换行

2、大括号左右,总结如下:

1左大括号前不换行

2左大括号后换行

3右大括号前换行

4右大括号后面是else或逗号,则不换行否则作为终止符必须换行

3+号等操作符前换行,逗号后面换行,增加代码可读性

 

4.3 缩进

缩进建议采用4个空格作为一个单位,可设置一个tab键为4个空格,一般为开始一个新的块使用缩进,块结束时返回先前的缩进级别(从属关系)。

4.4 空格

1、运算符之间使用空格

正列:a == b ? true : false

反例:a==b?true:false;

2、逗号后使用空格,不能在逗号前

正列:findData(a, b, c);

反例:finData(a,b ,c);


第五章 代码习惯

5.1 异常抛出

进程和线程可能出现一系列异常,异常的出现如果没有抛出可能会导致进程死掉或线程崩溃,所以需养成异常捕获抛出的习惯,避免应用因进程卡住,异常异常捕获后,需打印异常日志,否则出现异常时不好查找问题。

5.2 减少嵌套

代码嵌套层太多,会严重影响代码可读性,处理方法:

1、使用return跳出,减少else使用

2、条件使用逻辑运算符(&& ||等)进行拼接

3、整合成子方法

5.3 判断字符串相等

1java中字符串的比较是==比较引用,equals比较值

我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题

 例子1String a="abc";String b="abc"

那么a==b将返回true。因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存

 一份,所以ab指向的是同一个对象;

例子2String a=new String("abc"); String b=new String("abc");

 那么a==b将返回false,此时ab指向不同的对象。

 2equals方法比较的是字符串的内容是否相同

exampleString a=new String("abc"); String b=new String("abc"); a.equals(b);将返回true

通常情况下,为了避免出现上述问题,判断字符串是否相等使用equals方法,具体的原因得引出常量池概念,这里不做详细描述

5.4 字符串拼接

拼接字符串尽量使用StringBuffer或者StringBuilder使用+号每次会new一个对象,对空间和性能还是有一定影响的。

5.5 NPE处理

java开发最常见的异常就是NPEjava.lang.NullPointerException)异常,需有效的规避异常,进行null判断,可能出现null模块,取集合元素,数据截取,方法返回,socket传输的数据,数据库取值等等...

5.6 日志输出

平时调试代码或输出日志习惯使用System.out.println()system.out都写入到一个文件里去了,对一个文件的读写就会排队写而且syso在当前线程,必须写完才继续下面的程序。 如果使用log工具你的日志会发散在多个日志文件上。可以控制日志是否输出而且log工具只是通知要写日志,而不必等日志写完