PO:(Persistent Object)持久层对象,它是由一组属性和属性的get和set方法组成的,最简单的 PO 就是对应数据库中某个表中的一条记录
DO:与数据库表结构一一对应,通过DAO层向上传输数据源对象。
VO:展示对象,通常用于业务层之间的数据传递。
BO:业务对象。 由Service层输出的封装业务逻辑的对象。
POJO:POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
命名风格
Service/DAO 层方法命名规约:
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save(推荐)或 insert 做前缀。
5) 删除的方法用 remove(推荐)或 delete 做前缀。
6) 修改的方法用 update 做前缀。
常量定义
枚举成员名称需要全大写,单词间用下划线隔开。
DealStatusEnum : UNKOWN_REASON
接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释。
数组定义如下:String[] args;
常量命名全部大写,单词间用下划线隔开:MAX_STOCK_COUNT
抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。
常量的复用层次:
1)子工程内部共享常量:即在当前子工程的 constant 目录下。
2) 包内共享常量:即在当前包下单独的 constant 目录下。
3) 类内共享常量:直接在类内部 private static final 定义。
代码格式
右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
方法参数在定义和传入时,多个参数逗号后边必须加空格
集合处理
只要重写 equals,就必须重写 hashCode
因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
使用集合转数组的方法,必须使用集合的 toArray
不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
使用 entrySet 遍历 Map 类集合 KV,效率更高,只遍历一次
如果是 JDK8,使用 Map.foreach 方法

利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的contains 方法进行遍历、对比、去重操作。
线程安全
线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式
线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
多线程并行处理定时任务时,Timer 运行多个 TimeTask 时,只要其中之一没有捕获
抛出的异常,其它任务便会自动终止运行,使用 ScheduledExecutorService 则没有这个问题。
子线程抛出异常堆栈,不能在主线程 try-catch 到
控制语句
在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。
在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免使用单行的形式
不要在条件判断中执行其它复杂的语句
注释规范
使用 /** **/ 格式来注释
其它
多用正则表达式
异常
Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该
通过 catch 来处理,如:IndexOutOfBoundsException,NullPointerException等
示例:if (obj != null) {...}
对大段代码进行 try-catch,这是不负责任的表现。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
定义时区分 unchecked / checked 异常,避免直接抛出 new RuntimeException(),更不允许抛出 Exception 或者 Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException / ServiceException 等
在代码中使用“抛异常”还是“返回错误码”,对于公司外的 http/api 开放接口必须
使用“错误码”
SQL语句
不要使用 count(列名)来替代 count(),count()跟数据库无关,跟 NULL 和非 NULL 无关。count()会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。*
当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为NULL,因此使用 sum()时需注意 NPE 问题。
不得使用外键与级联,一切外键概念必须在应用层解决。
学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。
如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,则为级联更新。
外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内。
不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。
@Transactional 事务不要滥用。事务会影响数据库的 QPS(每秒钟处理请求的次数)
IDEA 快捷键:
⌥⌫ 删除到单词的开头 option+delete
⌘⌥L 格式化代码 command+option+L
command + shift + 上下箭头
shift + Tab键 缩进代码
网友评论