浅谈java应用编码习惯

借用梦断代码中的一句话“软件乃是人类自以为最有把握,实则最难掌控的技术。”,这里以国内主流互联网公司的java代码规约来解读编码规范。

命名(Naming)

每种编程语言都有自己的规范和约定,Java编程语言也不例外。命名变量的规则和约定可归纳如下:

变量命名规则

变量名称区分大小写,如果名称只包含一个单词,则全部小写,如果它由多个单词组成,则将每个后续单词的首字母大写。名称gearRatio和currentGear是此约定的示例。

静态变量

直接使用类名对静态变量进行引用,如果变量存储常量值,例如static final int NUM_GEARS = 6,则约定会略有变化,将每个字母大写并用后缀字符分隔后续单词。

注:Oracle的建议中下划线除了在此处用,其他地方命名都不建议使用,尤其是类名中更不建议使用$符和_(下划线)。

随处可见的魔法常量值也是不建议的,可以参考Integer.MAX_VALUE这类的常量命名和引用方式。

String val = "id_"+num;
int idList[] = new int[16];

关于代码换行

如果大括号({})中间没有内容,则无须换行。如:如一个无参的构造方法,没有任何内容,则直接写为:public User(){}。

左大括号({)不换行,右大括号(})后换行。

右大括号(})前换行,右大括号(})后的else等代码不换行。

代码结尾的右大括号(})必须换行。

运算符与下文一起换行,

方法调用符号(.)与下文一起换行,

方法实参列表,在逗号后换行(如有需要),括号前不要换行。

单行字符长度限制

第二行相对第一行缩进 4 个空格,第三行开始,不再继续缩进。

线程安全

单例模式要保证线程安全,单纯的synchronized和双重检查锁机制,并不能保证初始化安全,有必要时需要引入final关键字。

注释

单行与多行的注释按Javadoc注释规范来写自然不必多说,注释内容的质量却很难有统一的规范,所以很多注释反而是混淆视听,注释的目的不在于表达代码的逻辑,而是对所要提供的功能作说明。

很多注释像是在引导新人读代码,而不是在为一段代码的功能作注或对一种业务场景作描述。这种让人哭笑不得的注释不要反而干净。

异常处理

不要捕获RuntimeException,声明式事务所在的业务层try catch 异常后,如果需要回滚事务,要手动回滚事务。不在 finally catch块中使用 return。

日志系统

不直接使用日志系统的API(Log4j、Logback,),应使用日志框架接口的API(SLF4J,commons-logging)。日志文件保留时间一至半个月。

数据类型

数据类型用于规定它可以存储的值,以及允许对其执行的操作。存放小数时尽量使用 decimal,而非 float 和 double,尤其在货币业务场景中。

float 和 double本身是为科学和工程计算设计的,都采用单精度算法,较长的浮点范围不保证也不会提供精确的值,不适用于货币计算领域。

服务器

高并发服务器time_wait参数建议不超过30,操作系统默认240秒。