一、代码格式
1.命名
-
代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
-
所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。
-
常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
-
抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾。
-
POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列 化错误。
-
包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
-
避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名, 使可理解性降低。
-
杜绝完全不规范的缩写,避免望文不知义。
2.间隔
-
如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;如果是非 空代码块则:
1) 左大括号前不换行。
2) 左大括号后换行。
3) 右大括号前换行。
4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
-
左小括号和右边相邻字符之间不出现空格;右小括号和左边相邻字符之间也不出现空格;而左大括号前需要加空格。
-
if/for/while/switch/do 等保留字与括号之间都必须加空格。
-
任何二目、三目运算符的左右两边都需要加一个空格。说明:包括赋值运算符=、逻辑运算符&&、加减乘除符号等。
-
采用 4 个空格缩进,禁止使用 Tab 字符。
说明:如果使用 Tab 缩进,必须设置 1 个 Tab 为 4 个空格。IDEA 设置 Tab 为 4 个空格时,请勿勾选 Use tab character;而在 Eclipse 中,必须勾选 insert spaces for tabs。
-
注释的双斜线与注释内容之间有且仅有一个空格。
-
在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开。
-
单行字符数限制不超过 120 个,超出需要换行,换行时遵循如下原则:
1)第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
2)运算符与下文一起换行。
3)方法调用的点符号与下文一起换行。
4)方法调用中的多个参数需要换行时,在逗号后进行。
5)在括号前不要换行。
-
方法参数在定义和传入时,多个参数逗号后面必须加空格。
-
IDEA 的 text file encoding 设置为 UTF-8; IDEA 中文件的换行符使用 Unix 格式,不要 使用 Windows 格式。
3.常量
-
不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
-
在 long 或者 Long 赋值时,数值后使用大写字母 L,不能是小写字母 l,小写容易跟 数字混淆,造成误解。
-
常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
1)跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。 2)应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。 反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量: 类 A 中:public static final String YES = "yes"; 类 B 中:public static final String YES = "y"; A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。 3)子工程内部共享常量:即在当前子工程的 constant 目录下。 4) 包内共享常量:即在当前包下单独的 constant 目录下。 5) 类内共享常量:直接在类内部 private static final 定义。
二、数字
1.等值判断问题
BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法。
说明:equals()方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo()则会忽略精度。
2.类型转换问题
禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。
说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
如:BigDecimal g = new BigDecimal(0.1F); 实际的存储值为:0.10000000149
优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
三、日期时间
1.格式
日期格式化时,传入 pattern 中表示年份统一使用小写的 y。
说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后 引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY 就是下一年。
表示日期和时间的格式如下所示: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
**在日期格式中分清楚大写的 M 和小写的 m,大写的 H 和小写的 h 分别指代的意义。 **
说明:日期格式中的这两对字母表意如下:
1) 表示月份是大写的 M;
2) 表示分钟则是小写的 m;
3) 24 小时制的是大写的 H;
4) 12 小时制的则是小写的 h。
2.引用
不允许在程序任何地方中使用:1)java.sql.Date。 2)java.sql.Time。 3)java.sql.Timestamp。
说明:
第 1 个不记录时间,getHours()抛出异常;
第 2 个不记录日期,getYear()抛出异常;
第 3 个在构造 方法 super((time/1000)*1000),在 Timestamp 属性 fastTime 和 nanos 分别存储秒和纳秒信息。
四、集合
1.集合判空
判断所有集合内部的元素是否为空,使用 isEmpty()方法,而不是 size()==0 的方式。
说明:在某些集合中,前者的时间复杂度为 O(1),而且可读性更好。
在使用 Collection 接口任何实现类的 addAll()方法时,都要对输入的集合参数进行 NPE 判断。
说明:在 ArrayList#addAll 方法的第一行代码即 Object[] a = c.toArray();
其中 c 为输入集合参数,如果 为 null,则直接抛出异常。
集合非空判断,使用 CollectionUtil.isNotEmpty()方法
2.转换
使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法, 它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配
器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "chen", "yang", "hao" };
List list = Arrays.asList(str);
第一种情况:list.add("yangguanbao"); 运行时异常。
第二种情况:str[0] = "change"; 也会随之修改,反之亦然。
3.取集合中的一个对象
list.stream().____.findFirst().orElse(null);
五、MySQL数据库
1. null值处理
使用 ISNULL()来判断是否为 NULL 值。
说明:NULL 与任何值的直接比较都为 NULL。
1) NULL<>NULL 的返回结果是 NULL,而不是 false。
2) NULL=NULL 的返回结果是 NULL,而不是 true。
3) NULL<>1 的返回结果是 NULL,而不是 true。
2. 配置
# 访问控制关闭
protected-mode no
# 指定端口号
port 26379
# 指定工作模式,是否守护线程
daemonize yes
# 指定哨兵监控master节点的配置
# Sentinel monitor <主节点别名> <主节点host> <主节点端口> <票数> ;后⾯面这个2是指几个哨兵发现master宕机了,才进⾏故障转移
sentinel monitor mymaster 192.168.5.44 6379 2
# 设置主机访问密码
sentinel auth-pass mymaster 123456
# 哨兵连接不上master就认为master宕机了的时间,单位是毫秒,默认30秒
sentinel down-after-milliseconds mymaster 3000
# 新的master出现后,其他follow的slave并⾏同步的个数,并⾏的越多同时阻塞的就越多,设置1来保证每次只有一个slave 处于不能处理命令请求的状态
sentinel parallel-syncs mymaster 1