【阿里开发规范】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-";
    }

    @Override
    public 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>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

你可能感兴趣的:(java)