java编码规范

总结
单纯的字符串拼接使用“+”,更快更简洁。也是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.过段时间复读

  文章放段时间再拿出来看能发现很多问题,代码一样,一段时间后人的思维惯性没那么强了,改代码的抵触心理也会少很多,更容易发现问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值