其中1.2.3…条为约定风格,实际代码指的是企业级代码中也存在的情况
实际代码中也出现如【getHistory_new】之类的方法名,但使用$的很少
实际代码中如果英文很繁琐,词不达意或者晦涩难懂,全拼音也存在于代码中。
写的时候不要嫌长,尽量使用统一的前缀或后缀,既便于区分,又便于分类查找
实际代码中包名是复数还是有存在,如utils包等等
实际代码中存在content缩写成cont的情况
实际代码中,根据个人习惯,有的喜欢全加,从代码的简洁度考虑,推荐不加 如 void updateUserInfo();
这个要求比较高,有时候业务逻辑很复杂,除了判断还有很多计算和查询,可以考虑先实现功能,然后再把能提的方法提出来,然后优化代码(如判断,循环之类)eclipse里可采用shift+alt+M进行方法提取
java.net.URLDecoder 中的方法 decode(String encodeStr) 这个方法已经过时,应该使用双参数
decode(String source, String encode)。接口提供方既然明确是过时接口,那么有义务同时提供新的接
口;作为调用方来说,有义务去考证过时方法的新实现是什么。
实际代码中确实在使用这个方法当 参数中有特殊字符时进行编码
如 private Boolean deleteFlag= false;这种情况有危险,但在实际的代码编写中也有这种业务逻辑存在并采用上述默认值方式
IDE中shift+alt+s可以生成。举例,实际代码中,由于业务原因修改了字段的名称,由于不想删除所有get,set()方法,于是手动修改了一个属性的get/set(),但是没有注意大小写,细微的错误,还是同事发现,很低级错误,希望大家引以为戒
如Controller中一般public的方法可能会有个私有方法,实际代码中有的时候放在类的最下面,有的时候放在当前方法的下面,这是由于代码时多人同时开发,有时候并不能做到公有方法在同一个地方,私有方法都在下面。
Stirng str = “start”;
for(int i = 0;i<1000;i++){
str = str+“hello”;
}
扩展:不同语言中,1000这个终止循环条件如果是写成userList.size()这种获取方式,也会拖慢速度,可以考虑先在循环外进行提取。
for (String item :list){
if("1".equals(item){
list.remove(item)}
)
}
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String item = iterator.next();
if(判断条件){
iterator.remove();
}
}
HashMap
userCache = new HashMap<>();
但注意JDK7以上才支持
14.集合初始化的时候指定大小
一般Map
newMap = new HashMap<>(16);
其中16为默认值,当不确定其大小的时候可以设置
举例当需要放置1024个元素时,由于没有设置容量的初始大小,随着元素的不断增加,连续扩容7次,resize时需要重建hash表,影响性能
- keySet遍历了2次,一次转换为Iterator对象,另一次是从hashMap中去除key对应value,得到的是K值集合
- entrySet只遍历一次,效率更高,得到的是K-V组合
- JDK8,推荐使用Map.forEach方法
每个case要么通过continue/break/return来终止,要么注释说明程序将执行到哪个cases为止,
每个switch必须包含一个default语句并放在最后,即使它什么代码都没有
实际代码中,最好使用大括号,有的人为了代码简洁,省略大括号,但可读性差,不利于维护
if(a>b)b=a;
相对于
if(a>b){
b=a;
}
说明:如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间判断条件
来代替。
if(a>b){
return false;
}
//todo,业务逻辑
这种情况企业代码中很常见,if的循环嵌套会导致代码冗长,还得找每个else 对应的if(虽然在eclipse里,在if的左大括号双击就能高亮期间的代码),很费劲。
- 举例:在Controller层接受参数的时候,判断参数如果为空或非数字,直接return返回到页面提示参数有误,直到所有条件被筛选完成,才进行真正的业务逻辑的编写。
final boolean existed = (file.open(fileName, “w”) != null) && (…) || (…);
if (existed) {
…
}
commons.lang3中
a: !StringUtils.isBlank(a)
b: StringUtils.isNotBlank(a)
推荐使用b而不是a
if(obj!=null){…}
在springmvc中,如果配置了同一的事物管理spring-transaction.xml文件,一般在controller里将调用manager层的方法try catch,在manager里不用catch,也不用throw。
finally(){
if(bis!=null){
try{
bis.close();
}catch(e){
log.err(xxxxxxxxxxxxxx)
}
}
}
try 块中的 return 语句执行成功后,并不马上返回,而是继续执行 finally 块中的语句,如果此处存
在 return 语句,则在此直接返回,无情丢弃掉 try 块中的返回点。
反例:
private int x = 0;
public int checkReturn() {
try {
// x 等于 1,此处不返回
return ++x;
} finally {
// 返回的结果是 2
return ++x;
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
说明:因为 String 字符串的拼接会使用 StringBuilder 的 append()方式,有一定的性能损耗。使用占位符
仅是替换动作,可以有效提升性能。
正例: logger.debug(“Processing trade with id: {} and symbol: {}”, id, symbol);
< name=“com.taobao.dubbo.config” additivity=“false”>
logger.error(各类参数或者对象 toString() + “_” + e.getMessage(), e);
大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些
日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
手机号码139****2525,隐藏中间四位
- page size过大导致内存溢出
- 恶意order by导致数据库慢查询
- 任意重定向
- SQL注入
- 反序列化注入
举例:评论有敏感词,分一级(直接驳回)二级(人工审核)
- 存在精度损失的问题
- 如果存储范围超过decimal范围,建议将数据拆成整数和小数并分开存储
说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生
正例:先快速定位需要获取的 id 段,然后再关联:
SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
说明:
1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2) ref 指的是使用普通的索引(normal index)。
3) range 对索引进行范围检索。
反例:explain 表的结果,type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range
还低,与全表扫描是小巫见大巫。
说明:存在非等号和等号混合时,在建索引时,请把等号条件的列前置。如:where c>? and d=? 那么
即使 c 的区分度更高,也必须把 d 放在索引的最前列,即索引 idx_d_c
说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
说明:NULL 与任何值的直接比较都为 NULL。
1) NULL<>NULL 的返回结果是 NULL,而不是 false。
2) NULL=NULL 的返回结果是 NULL,而不是 true。
3) NULL<>1 的返回结果是 NULL,而不是 true。
说明:以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
说明:OOM 的发生是有概率的,甚至相隔数月才出现一例,出错时的堆内信息对解决问题非常有帮助。
摘自 Java开发手册华山版,仅作为学习交流,如有侵权,请告知删除。