java适合初学者看的代码(-码出高效.java开发手册之代码风格)
java适合初学者看的代码(-码出高效.java开发手册之代码风格)【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。 说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。 正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。(二)常量定义《手册》的PDF版点此下载 https://yq.aliyun.com/download/2719?utm_content=m_1000016761(一)命名风格【强制】POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛 出异常。
背景:9月22日杭州云栖大会,众所期待的新书《码出高效:Java 开发手册》正式发布,并宣布将所有图书收益捐赠于公益项目。这本书源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》(简称《手册》)。2017年2月9日,《手册》的PDF版一经公布,在各大网络平台引发热议,甚至走进硅谷,让世界听到中国程序员的声音。2017年,此手册配套的扫描插件发布后,已经有45万名开发工程师下载,数以千计的企业在内部推行。《手册》在研发效能、人才培养与系统稳定性领域都产生了巨大而深远的影响,已经成为重要的开发基础标准文件。
码出高效.java开发手册
《手册》的PDF版点此下载 https://yq.aliyun.com/download/2719?utm_content=m_1000016761
(一)命名风格
【强制】POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛 出异常。
(二)常量定义
【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。 说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。 正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。
【推荐】如果变量值仅在一个固定范围内变化用 enum 类型来定义。 说明:如果存在名称之外的延伸属性应使用 enum 类型,下面正例中的数字就是延伸信息,表 示一年中的第几个季节。 正例: public enum SeasonEnum {
SPRING(1) SUMMER(2) AUTUMN(3) WINTER(4);
private int seq; SeasonEnum(int seq){ this.seq = seq;
}
}
(三)代码格式
【强制】注释的双斜线与注释内容之间有且仅有一个空格。 正例:
// 这是示例注释,请注意在双斜线之后有一个空格
String ygb = new String();
(四)OOP规约
【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。 反例:POJO 类的 gmtCreate 默认值为 new Date(),但是这个属性在数据提取时并没有置入具 体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。
【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无 内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。 说明:
String str = "a b c ";
String[] ary = str.split(" ");
// 预期大于 3,结果是 3
System.out.println(ary.length);
(五)集合处理
【强制】使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样大的数组,大小就是list.size()
正例:
List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); String[] result = new String[list.size()]; result = list.toArray(result);引自 1
【强制】使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear 方法会抛出 UnsupportedOperationException 异常。说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法,Arrays.asList体现的是适配器模式,只是转换接口,后台数组仍是数组。
【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式。如果并发操作,需要对Iterator对象加锁
【推荐】高度注意Map类集合K/V 能不能存储null值的情况。
(六)并发处理
【强制】线程池不允许使用Executor去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,避免资源耗尽的风险。
【强制】SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁或者使用DateUtils 工具类。说明:如果是JDK8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat
【推荐】使用CountDownLatch进行异步转同步操作操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果。说明:注意,子线程抛出异常堆栈,不能在主线程try-catch到。