名词解释
1.一方库:本工程内部子项目模块依赖的库(jar包)。
2.二方库:公司内部发布到中央仓库,可供公司内部其它应用依赖的库(jar包)。
3.三方库:公司之外的开源库(jar包)。
4.OOP:面向对象编程。
5.静态变量: 类型说明符是static。
6..栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储 区。里面的变量通常是局部变量、函数参数等。
7.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制。
- 静态存储(static storage),这里的“静态”是指“在固定的位置”(尽管也在 RAM 里)。静态存储里存放程序运行时一直存在的数据。你可用关键字 Static 来标识一个对象的特定元素是静态的,但 Java 对象本身从来不会存放在静态存储空间里。
9.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)。
java开发细节-编程约定(二)
OOP规约
- 访问一个类的静态变量或者静态方法时,可直接使用类名来访问。如工具类(Constants.vertime).
- 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。
- Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。( eg:”test”.equals(object) )
- 所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。(避免对堆内存造成浪费)
- 包装类使用情况:所有的POJO类属性;RPC方法的返回值和参数必须使用包装数据类型;(数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险)
- POJO类必须写toString方法。
- 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。(避免造成资源浪费)
- 工具类不允许有public或default构造方法。
集合处理
有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。
- Set集合存储的是不重复的对象。
- 在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException 异常。
- 使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。
- 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
- 集合初始化时,指定集合初始值大小。(eg:ArrayList,在每次添加数据都会判断,这个数据是否已经到达临界值,如果到达临界点则会扩容1.5倍。造成效率低,资源浪费)。
- 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历.(速率可以快近一倍)。
并发处理
- 获取单例对象需要保证线程安全,其中的方法也要保证线程安全。
- 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
- 高并发时,同步调用应该去考量锁的性能损耗。尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法。
- 对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。
- 如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。
- 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降。
- volatile解决多线程内存不可见问题。(public volatile boolean iswork = true;)
控制语句
- 在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
- 表达异常的分支时,少用if-else方式,这种方式可以改写成:
if (condition) {
...
return obj;
}
// 接着写else的业务逻辑代码;
- 如果必须要使用if…else if()…else,不要超过三层。
- 循环体中的语句要考量性能,如定义对象、变量、获取数据库连接则在循环体外进行。
注释规约
对于注释的要求:第一、能够准确反应设计思想和代码逻辑;第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。好的命名、代码结构是自解释的,注释力求精简准确、表达到位。
- 类、类属性、类方法的注释必须使用Javadoc规范,使用/*内容/格式。
- 所有的抽象方法(包括接口中的方法)必须要用Javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
- 所有的类都必须添加创建者和创建日期。
- 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
- 代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
- 待办事宜(TODO):( 标记人,标记时间,[预计处理时间])