代码规范
参照阿里开放出来的规范吧
阿里java代码规范
关键字
访问控制修饰符
访问修饰符 | 同一个类 | 同包 | 不同包,子类 | 不同包,非子类 |
---|---|---|---|---|
private | 1 | |||
默认 | 1 | 1 | ||
protected | 1 | 1 | 1 | |
public | 1 | 1 | 1 | 1 |
需要注意的关键字
关键字 | 修饰范围 | 作用 | 场景 |
---|---|---|---|
final | 类,类变量,方法,参数变量 | 类:不可继承;变量:不可重新赋值;方法:不可覆写,防止数据变更;防止继承类,防止覆写方法,目的就是固化,避免改变后出现不可预知的问题,注意是不可重新赋值,比如map等还是可以修改内部的数据的 | 常量定义;防止改变 |
finally | try后面 | 无论执行try或cache完之后执行(除非程序退出),注意finally里面有抛出异常或返回值的时候会覆盖try或cache代码块内的异常或返回值,异常优先于返回值,另外注意finally里面如果重新给try或cache返回的变量重新赋值是不会改变返回结果的,但如果修改返回变量内的值会影响返回结果(比如返回是个map,里面的数据变更) | 关闭流,释放资源等 |
static | 内部类,方法,变量,代码块 | 设置为全局可用,无需创建实例就可以访问(可以用访问控制限制访问权限,但实际上就是全局的),内存中只存在一份数据,另外是加载类的时候进行执行静态代码的初始化和执行(一般指的的是静态代码块,按顺序执行),注意会出现并发问题,内存问题. | 公共常量,工具类,初始化 |
strictfp | 类、接口,方法 | 保证浮点运算的结果使用统一的标准进行浮点运算(使忽略环境因素),提高程序的可移植性,但会降低一定的性能,注意不允许对接口中的方法以及构造函数声明strictfp关键字 | 系统会运行在不统一的环境下,并且对数字精确度有一定要求的情况下 |
synchronized | 方法,代码块 | 用来做线程同步,一般情况下用this或class来做,但有区别,this用于锁单个对象,两个对象是不锁的,通常使用单例和this组合来用,class的情况一般是用于静态方法的情况下使用,细节单独说明 | 解决并发问题,比如懒加载初始化的并发问题 |
throw | 代码 | 用于错误处理,首先避免随意抛出,其次如果使用尽量自定义Exception,并且覆写同步锁相关的代码,否则有一定的性能损耗 | 抛出关键自定义业务异常 |
transient | 属性 | 序列化的时候忽略该属性 | 首先业务不需要序列化的可以加上,其次要考虑某些引用类型的序列化问题(流,文件等),最后还有比较大的数据类型(很长的一个字符串) |
volatile | 属性 | 标识每次使用它都到主存中进行读取,而不是各线程的缓存区,但只能保证取的从一个地方读取,无法保证原子性,依然有并发问题(一般还要和锁同时使用才行) | 频繁多线程有读且有写的静态变量 |