您的位置:首页 > 编程语言 > Java开发

JAVA 编程规范

2017-10-12 22:57 141 查看

命名规范

包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用

类名使用UserInfo 风格 但以下情形例外: DO / BO / DTO / VO / AO /

PO

方法名、参数名、成员变量、局部变量 命名采用驼峰命名规则,如 updateUserById(int userId)

常量命名全部大写,单词间用下划线隔开 力求语义表达完整清楚,不要嫌名字长。

抽象类命名使用 Abstract 开头,如AbstractPerson

异常类命名使用 Exception 结尾,如CustomException

测试类 命名以它要测试的类的名称开始,以 Test 结尾CallServiceTest

测试方法名以test开头,如:testUpdateUser(User user)

枚举类名使用 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开

线程名使用Thread-开头,如Thread-ExtensionStatus

代码命名规范(各层命名)

Service/DAO(Mapper)层方法命名

1) 单个查询的方法名用 get做前缀 ,如 getUserById(int id)

2) 获取多个对象的方法名用 list 做前缀 ,如 listUserByGender(int gender)

3) 获取统计值的方法名用 count 做前缀,如 countAllUser()

4) 插入的方法用 save/ insert 做前缀 ,如 saveUser(User user) 或 insertUser(User user)

5) 删除的方法用 remove/delete 做前缀 ,如 removeUserById(int userId) 或modifyUserById(int userId)

6) 修改的方法用 update/modify 做前缀 ,如 updateUserByLoginId(String loginId)

领域模型命名规范

1 ) 数据对象: xxxDO , xxx 即为数据表名。

2 ) 数据传输对象: xxxDTO , xxx 为业务领域相关的名称。

3 ) 展示对象: xxxVO , xxx 一般为网页名称。

4 ) POJO 是 DO / DTO / BO / VO 的统称,禁止命名成 xxxPOJO 。

代码格式

左小括号和字符之间不出现空格 ; 同样,右小括号和字符之间也不出现空格采用 4 个空格缩进,禁止使用 tab 字符

注释的双斜线与注释内容之间有且仅有一个空格

单行字符数限制不超过 120 个,超出需要换行,换行时遵循如下原则:

1) 第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。

2 ) 运算符与下文一起换行。

3 ) 方法调用的点符号与下文一起换行。

4 ) 方法调用时,多个参数,需要换行时,在逗号后进行。

5 ) 在括号前不要换行

方法参数在定义和传入时,多个参数逗号后边必须加空格

不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性

关于集合的处理

关于equals的处理 : 只要重写equals 就必须重写hashCide

使用工具类 Arrays . asList() 把数组转换成
4000
集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常 原因:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法 Arrays . asList体现的是适配器模式,只是转换接口,后台的数据仍是数组

不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁

集合初始化时,指定集合初始值大小

利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的contains 方法进行遍历、对比、去重操作

并发处理

创建线程或者线程池的适合 ,指定有意义的线程名,用以出错时查询

public class TestThread extends Thread {
public TestThread(){
super.setName("testThread");
}
@Override
public void run() {
super.run();
}
}


线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的人更加明确线程池的运行规则,规避资源耗尽的风险

ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(3,10,100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));


原因在于: Executors 可以创建三种 ThreadPoolExecutor FixedThreadPool 和 SingleThreadPool :允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM CachedThreadPool ScheduledThreadPool :允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static ,必须加锁,或者使用 DateUtils 工具类

如果是 JDK 8 的应用,可以使用 Instant 代替 Date , LocalDateTime 代替 Calendar DateTimeFormatter 代替 SimpleDateFormat

//str to date
String dateStr="2017年11月11日";
DateTimeFormatter dateTimeFormatter= DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date=LocalDate.parse(dateStr,dateTimeFormatter);
System.out.println(date);

//date to str
LocalDateTime localDate=LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss a");
String nowStr = localDate .format(format);
System.out.println(nowStr);


多线程并行处理定时任务时, Timer 运行多个 TimeTask 时,只要其中之一有捕获抛出的异常,其它任务便会自动终止运行,使ScheduledExecutorService 则没有这个问题

流程控制

在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止 ; 在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使空代码

在 if / else / for / while / do 语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式: if (condition) statements;

在高并发场景中,避免使用”等于”判断作为中断或退出的条件

除常用方法(如 getXxx/isXxx )等外,不要在条件判断中执行其它复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性

避免采用取反逻辑运算符 : 原因取反逻辑不利于快速理解,并且取反逻辑写法必然存在对应的正向逻辑写法

注释规范

类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不得使用// xxx 方式

所有的抽象方法 ( 包括接口中的方法 ) 必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能

所有的类都必须添加创建者和创建日期

所有的枚举类型字段必须要有注释,说明每个数据项的用途

代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改

谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: