【阿里开发规范】Java开发手册(嵩山版)
【阿里开发规范】Java开发手册(嵩山版)
Java开发手册(嵩山版)
- 所有的POJO类属性必须使用包装数据类型
- 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放到init方法中
- 类成员与方法访问控制从严:
(1)类成员方法只对继承类公开,那么限制为protected
(2)若是static成员变量,考虑是否为final
说明:任何类,方法,参数,变量,严格控制访问范围。过于宽泛的访问范围,不利于模块解耦。 思考:如果是一个private的方法,想删除就删除,可是一个public的service成员方法或者成员变量,删除一下,不得手心冒点汗吗?变量像自己的孩子,尽量在自己的视线内,变量作用域太大,无限制 的到处跑,那么你会担心的。 - 单个方法的长度不超过90行
- 类内方法定义的顺序依次是:公有方法或者保护方法 > 私有方法 > getter/setter方法
- 日期格式化时,传入pattern中表示年份统一使用小写的y。yyyy表示当天所在的年,YYYY代表week in which year(JDK1.7之后),当天的周属于的年份,周日开始到周六结束,只要本周跨年,YYYY返回的年份就是下一年
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- 不要在程序中写死一年为365天 获取今年的天数
//获取今年的天数
int daysOfThisYear = LocalDate.now().lengthOfYear();
//获取指定某年的天数
LocalDate.of(2011,1,1).lengthOfYear();
- 使用enum指定月份 Calendar.JANUARY,Calendar.FEBRUARY …
- 判断所有集合内部的元素是否为空,使用isEmpty()方法,而不是size() == 0 的方法
//说明:在某些集合中,前者的时间复杂度为O(1),而且可读性更好
Map<String,Object> map = new HashMap<>(16);if (map.isEmpty()){System.out.println("no element in this map.");}
- 在使用java.util.stream.Collectors类的toMap()方法转为Map集合是,一定要使用
注意:(1)含有参数类型为BinaryOpeartor,参数名为mergeFunction的方法,否则当出现相同的key值时会抛出ILLegalStateException异常
(2)value为null时会抛NPE异常
ArrayList<Pair<String,Double>> pairArrayList = new ArrayList<>(3);
pairArrayList.add(new Pair<>("version",12.10));
pairArrayList.add(new Pair<>("version",12.19));
pairArrayList.add(new Pair<>("version",6.96));
Map<String,Double> map1= pairArrayList.stream().collect(Collectors.toMap(Pair::getType, Pair::getValue, (v1, v2) -> v2));
- 集合转数组,必须使用集合中toArray(T[] array),传入的是类型完全一致,长度为0的空数组
//长度等于0,动态创建与size相同的数组,性能最好
List<String> list = new ArrayList<>(2);list.add("guan");list.add("bao");String [] array = list.toArray(new String[0]);
- 集合的转化、Iterator循环不要进行remove/add操作
- 使用entrySet遍历map类集合KV,而不是keySet方式进行遍历。
map.entrySet(); //效率高,只是遍历了一次就把key和value都放到entry中
map.keySet(); //遍历了两次,一次转为Iterator,一次取key对应的value
map.forEach(); //JDK1.8使用这种方式
- map之间差异
new Hashtable<>(); //key: not null value:not null 线程安全
new ConcurrentHashMap<>(); //key: not null value:not null 锁分段技术(JDK8:CAS)
new TreeMap<>(); //key: not null value:allow null 线程不安全
new HashMap<>(); //key: allow null value:allow null 线程不安全
- 创建线程或者线程池是指定有意义的线程名称,方便出错时回溯
public class UserThreadFactory implements ThreadFactory {private final String namePrefix;private final AtomicInteger nextId = new AtomicInteger(1);public UserThreadFactory(String whatFeatureOfGroup) {this.namePrefix = "From UserThreadFactory's"+whatFeatureOfGroup+"-Worker-";}@Overridepublic Thread newThread(Runnable task) {String name = namePrefix + nextId.getAndDecrement();Thread thread = new Thread(null,task,name,2);System.out.println(thread.getName());return thread;}
- SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static, 必须加锁,或者使用DateUtils工具类
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){@Overrideprotected DateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd");}};