阿里巴巴java开发手册记录

1.继承意味着子类能调用父类一切方法,如果仅仅为了用父类某几个方法而继承,则容易方法滥用和继承爆炸
2.重载是不同的方法,重写才是多态的提现,一种方法签名的不同表现形式
3.类定义,公有方法放前面,然后保护方法,再者私有方法,最后getter setter,此外方法重载的应该放置在一起
4.抽象类应该是一类相同特征对象的抽象,接口是定义的一种can do的方法抽象体
5.方法签名包括方法名和参数,是jvm识别方法的唯一方式
6.代码分为稳定代码即无论如何都不回保存的,和非稳定代码如跟数据库交互,可能出现网络不通等不可预测问题,try catch是要处理那些非稳定代码的,try中不能太多代码,如果自己能处理就处理,否则向上抛,如果捕获了以后只打字日志,那就没必要捕获了
8.1先确定是必须捕获的异常种类(非稳定代码),如果是为了捕获NPE或下标越界则不能trycatch,应该代码处理,为什么要try catch,??如果只是为了打印日志则不要去try catch,捕获之后怎么处理?能在本类处理则处,不能则抛,抛什么异常?应该是有业务含义的异常,一般应该是daoexception或者serviceExcepition,尽量避免runtimeexception,controller层一定要捕获异常,进行处理
9.String[] arg0,中括号是数组的一部分
10.接口类方法签名不要加public
11.确定值.equals的使用
12.工具类方法都static
13.static的属性必须考虑是否为final
14.sublist子列是arraylist的视图,对子列的操作最终都会反应在原list上
15.subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加
16.集合转数组应该使用带参的toArray(array),能够自动扩展长度,使用 toArray 带参方法,入参分配的数组空间不够大时,toArray 方法内部将重新分配
内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组,元素将被置为 null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
List list = new ArrayList(2);
list.add(“guan”);
list.add(“bao”);
String[] array = new String[list.size()];
array = list.toArray(array);

直接使用无参的toArray只能返回object,强转容易转化异常
17.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator,另外,循环里用remove add会导致元素个数和位置变化,容易循环报错
正例:
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}

18.对map的遍历应该用Set<Entry<String,string>>=map.entrySet()
For循环能拿出一个个entry.getKey和value
,而不应该用keyset获得所有key值,效率低
19.只有hashset的key是可以存null的
20.switch case必须要有default,即便什么都不写
21少用if else,另外条件表达式如果比较长,将值赋给布尔变量再放在条件表达式
22.获得随机整数应该用Random.nextInt而不是扩大随机数之类的获得系统时间system.currentTimeMillis
23.获取当前线程的自定义名称应该用Thread.currentThread.getName
24.避免直接抛出runtimeexeption 应该使用daoexception或者serviceException
25.日志不能直接用log4j,而应该使用slf4j配合log4j,能够提供占位符打印
应该定义为static final的

private static final Logger logger = LoggerFactory.getLogger(Abc.class);

26.打印日志避免子类日志出现在父类的log文件中,避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false
27.除非排查问题,否则一般情况下关键节点,或者一个方法打印一个日志记录就行
28.正确打印异常日志的方式,两个参数的方式,这样吗会打印一部分堆栈信息,其它error(e.getmessage)是导致异常的参数值,但不会打印具体异常,e.toString也不会打印对栈,正例
logger.error(各类参数或者对象 toString + “_” + e.getMessage(), e);

29sql之所以不能用*,因为会查询列值为null的列
30.包名统一使用单数形式,分隔符左右都是表示一个语义的单词,其中的类如果有复数,则可使用复数形式
eg:工具包: com.yss.acs.todo.util ,类:Utils.java
反例:com.yss.acs.todo.utils
31.若有设计模式,则应该在类或者接口命名中体现出:orderFacoty、LoginProxy等
32.【强制】不允许任何魔法值(即未经定义的常量)直接出现在代码中
33.Long类型初始化时直接后缀L而不能l,否则跟1不好区分
Long time = 1L;
34.所有的覆写方法,必须加@Override 注解。
getObject()与get0bject()马上就区分出了,另外,当抽象方法签名有变化,立马能察觉
35.接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么
36. 推荐使用Objects.equal代替常用equal方法

什么类型都能比较
Objects.equals(1,2)

37.pojo类一定要打印toString(),在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题
38.使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无 内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。

  String string = "aw,bw,cw,d,,eee,,";
      String[] strings = string.split(",");
      这里打印的长度为6,split方法如果结尾无任何元素,会一直往前取消,直到碰到元素存在,如果改成  string = "aw,bw,cw,d,,eee,, (空格)" 那结果将会是8
       System.out.println(strings.length);

37.所有的RuntimeException都是要人为检查而避免的,不要通过try catch
38.单元测试相关:
(1)单元测试应该是全自动执行的,并且非交互式的。测试框架通常是定期执行的,执行 过程必须完全自动化才有意义,如Jenkins等工具会自动调用test路径下的方法,实现自动化
(2)输出结果需要人工检查的测试不是一个好的单元测试,单元测 试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。

对于有结果返回的判断
Assert提供了很多对结果判断接口,如isNull isTrue等等
  @Test
    public void testCanTransfer(){
    boolean result = iService.canTransfer("123",new BigDecimal("20000"));
    Assert.isTrue(result,"---不可以转账----");
}
对于没结果返回的判断,只是想测下代码执行有没有报错的话,可以采取以下迂回方式,接收异常
 public void  testDoTransfer(){
    //iService = new ServiceImpl();
    //对于没有返回值的要测试过程有么有报错
    Exception exception =null;
    try {
        int i =1/0;
        iService.doTransfer("123",new BigDecimal("20.33"));
    } catch (Exception e) {
        exception = e;
    }
    Assert.isNull(exception,"执行出错");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值