总结
单纯的字符串拼接使用“+”,更快更简洁。也是idea 推荐的 代码易读
循环拼接时使用“+”拼接字符串效率较低,推荐使用 StringBuilder。
阿里云的java规范 “ 一般建议5个参数,如果大于5个就要考虑是否封装对象进程传参
BigDecimal 用compareTo 会比较精度(不要用 equals 了) , 如果结果是0, 就是相等 >0 就是前面大于后面
泛型
使用单个大写字母, T使用的比较广泛。E通常被用于集合元素,K和V通常被用于映射关系。请勿使用多字符。
public <T> void print(T t);
interface List<E>{}
class HashMap<K, V> {};
mybatisplus包下的 StringPool.DASH 常量值为 -
hutool包下的 StrPool.DASHED; 常量值为 -
org.apache.commons.lang3.StringUtils.join(list, StringPool.COMMA); 返回 "1,1,1"
String str = String.join(StringPool.COMMA, list) 返回 "1,1,1"
不建议返回null, Collections.empty(); Collections.emptyList()
NPE异常保护
1.入参判空 Stirngutils.isEmpty()
2.使用Optional链式编程判断
// 推荐使用连续map orElse的写法
String score0 = Optional.ofNullable(person).map(person1 -> person1.getStudent()).map(student -> student.getScore()).orElse(null);
3.字符串判等使用合适的API
hutool的 StrUtil.equals(str1, str2) 避免空指针
lang3包下 StringUtils.equals(str1, str2) 避免空指针
hutool包下的ObjectUtil.equals(a, 1) 不仅可以字符串 也可以数字比较
String listStr = StringUtils.join(list, ','); // 比使用 String.join(",", list) 的好处是,可以避免list空指针
springboot运行目录下, 必须将临时文件及时删除, 非临时文件必须以ftp方式存储
int[] scores = {1,2,3}; //注意arr要加s
List nameList = new ArrayList(); //name的list集合
cancelJButton //组件类型名作为后缀, 取消按钮对象
关于成员方法, 尽量是动词 deleteTask()
public void(int aCounter){ //当方法参数和类成员属性同名, 加a以区分
this.counter = aCounter;
}
常亮 DEFAULT_VALUE
接口名的第一个字母必须是大写的“I” public interface ISettingOpertionService(lte-common项目里)远程调用接口
语句if (!(a < b))比相同含意的语句if (false == (a < b))更具可读性, 直接使用逻辑表达式即可
代码中不要直接使用魔法数(字面量),例如: if(cmd.equals("1")){....}, 应该将魔法数加到常量定义中,并对其代表的含义进行注释。如字符集对编码:
范例:
/* 字符集编码 */
public static final CHARACTER_ENCODING = “GB2312”;
if (charEncoding. equals(CHARACTER_ENCODING) ){}
反例:
if (charEncoding. equals(“GB2312”) ){}
在最小可能的范围内声明变量;
循环计数变量仅允许使用i, j, k, counter四个变量
建议8.15.2:LOG的打印格式如下。应该包含日期、包名、类名、方法名。其中打印的内容应以英文表示,不能含有汉字。
例如:[日期][包名][类名][方法名][提示信息][异常信息]
logger.info("拦截器已生效",e);
严禁在循环体中打印info、error级别的日志,可以打印debug级别日志。
switch…case结构中,每个case分支中必须使用break语句,除非确实存在多个case的处理流程完全相同,则在最后一个case处理完成后,使用break跳出;
说明:如果case中有处理语句,则必须使用break跳出。如果不使用break跳出,则程序将会继续向下判断其余的case分支,还会走入default分支,结果导致程序出错。
正例
例2:
void SomeMethod(int type){
switch(type){
case TYPE_A:
do thingA;
break;
case TYPE_B:
do thingB;
break;
default: //default并不是必须的,也可以不写
do something;
break;
}
}
接口类中废弃的方法定义应该删除,因为实现已经没有了
返回值为集合或者数组的方法,禁止返回NULL,应该返回0长度的集合或数组。
说明:使得调用者的代码会比较简练,无需判空处理。
关于异常
避免返回服务器的出错代码给前台 前台可能接受的是500
catch (Throwable e) { //日志记录异常信息
logger.error("unexpected error on handling ObjectMessage!", e);
throw new OmcException(errorcode);//抛出自定义异常 自定义异常的构造
}
慎用同步方法。
说明:同步使用不当,容易引起死锁,导致系统阻塞,从而造成用户无法操作。
优先使用基本类型,而不是基本类型的包装类(定义成员变量等)
说明:基本类型和装箱类型都可以使用时,如不涉及对象相关性质的,使用基本类型。
日志输出必须使用英文字,严禁使用中文日志。logger.debug(“add {} message begin”,mo);
严禁在循环中打印debug级别的日志, 开销太大
在频繁的消息处理和方法调用接口,只能写error级别的日志
记录当时的某些参数取值、或者关键状态等,有助于问题的分析。传入dn
public void startSynENBTask(String dn){
logger.debug(“start task {} begin”,dn);
// do message process
logger.debug(“start task {} end”,dn);
}
禁止在日志打印时拼接字符串,使用参数化方法打印日志。
说明:对于打印级别低于开关级别时,拼接是个多余的操作,影响代码性能。尽量保证每个参数都是单独的变量或者对象,参数最好也不要做拼接以及其他运算。
正例
logger.debug(“add {} message begin”,mo); // 一个参数
logger.debug(“cache message {} right is {}”,dn,isRight); // 两个参数
logger.debug(“{} cache message {} right is {}”,new Object[]{name,dn,isRight}) // 三个以及三个以上参数
logger.error(“add message error”,exception) //无参数异常
logger.error(“add {} message error”,dn ,exception) //有参数异常
logger.info("check:"+size()+",check2:"+size())
反例
logger.debug(“add ” + mo + “message begin”); // 禁止拼接字符串
logger.debug(“add {} message begin”,mo.toString()); //禁止显示调用toString。
集合对象使用规则:单线程应尽量使用HashMap、ArrayList ,而不要使用具有同步机制的HashTable、Vector降低了性能;随机查询尽量使用ArrayList,添加删除的操作LinkedList。
说明:HashMap、ArrayList由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable,Vector;反之在多个线程访问Hashtable、Vector时不需要自己为它的方法实现同步,使用比较方便。
避免在循环条件中使用表达式 如果循环条件被反复计算会影响执行效率;而使循环条件值不变的话,程序将会运行的更快。
正例
int size = vector.size ()
for (int i = 0; i < size; i++){
…
}
反例
for (int i = 0; i < vector.size (); i++) {
…
}
避免在循环体中创建对象,在循环体内定义临时变量将会增加内存消耗;
在循环体外定义变量,内存中只保存一份对象引用,不会产生大量的内存对象。
正例
void method (Vector v) {
Object o;
for (int i=0;i<v.size();i++) {
o = v.elementAt(i);
}
}
反例
void method (Vector v) {
for (int i=0;i < v.size();i++) {
Object o = new Object();
o = v.elementAt(i);
}
}
大量字符串的相加应该使用StringBuffer(线程安全)或StringBuilder(线程不安全)。
说明:StringBuffer线程安全,使用在多现场场景下,单线程下可使用StringBuilder。
正例
StringBuffer strBuf = new StringBuffer(10);
strBuf.append("A1");
strBuf.append("B1");
strBuf.append("C1");
反例
//以下写法虚拟机会分配多个内存块用来存储每个字符串
String a ="A1" + "B1" + "C1";
编程和写作有很多相通之处,学校里老师教的写作方法也是适合编程的。
1。反复推敲
同一个逻辑可以很多方式描述,但用那个更好更合适可以在走读时细细体会,推敲的标准是1.高内聚低耦合 2.接口优先 3.好看好理解 4.高效,运行速度快。
2.过段时间复读
文章放段时间再拿出来看能发现很多问题,代码一样,一段时间后人的思维惯性没那么强了,改代码的抵触心理也会少很多,更容易发现问题。
java编码规范
于 2019-06-08 16:07:10 首次发布