《改善java代码》第一章:java开发通用原则

1、命名:包名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法
2、三元操作符:
int i=80;
String s1= String.value(i<90?90:100);
String s2= String.value(i<90?90:100.0);
返回值不一样,s1返回90,s2返回90.0
3、反序列化时,构造函数不会执行,final变量会被重新赋值。 如果在升级的类中有一个final变量是构造函数赋值的,而且新旧版本还发生了变化,则在应用请求热切的过程中,很可能出现反序列化生成的final变量值与新产生的实例值不相同的情况,于是业务异常就产生了,严重的话,会影响交易数据。
因此,在序列化类中,不使用构造函数为final变量赋值。如果final变量是方法赋值的,如:final String name=initName(),则final并不会被重新赋值,之前说final变量会被重新赋值是说简单对象,包括8个基本类型,以及数组、字符串。
4、工资分为绩效工资和基本工资,需要对绩效工资保密。
方法1:绩效工资前加transient。这样做标志着工资类市区了分布式部署的功能,一旦遇到性能瓶颈,再想实现分布式部署就不可能了,此方法不可行。

5、instanceof
'A' instanceof Character :编译不通过,因为instance只能用于对象的判断,不能用于基本类型的判断。

null instanceof String : 返回值为false,若左操作数是null,结果就直接返回false,不再运算右操作数是什么类。使用于 (String)null instanceof String一样为false

new Date() instanceof String 编译不通过,因为Date类合String没有继承和实现关系,所以编译时直接报错。

"string" instanceof Object :    返回值为true,"string"是一个字符串,字符串又继承了Object,故返回true

new Object() instanceof String:  返回值为false,Object为父类。

6、我们常把项目中的常量全部放在一个类中,如public class Constant { public final static int MAX_AGE =120;}  我们用的时候,只需要Constant.MAX_AGE。此时,如果改了Constant的MAX_AGE值为180,但是在原始的编译器重新运行后发现,用到该常量的值仍然为120,原因是,对于final修饰的基本类型和String类型,编译器会认为它是稳定态,所以在编译时就直接把值编译到字节码中了,避免了在运行期运用,以提高代码的执行效率。但是final修饰的是类,则编译器会认为它是不稳定态,采用引用关系。

注:在现在的编译器没有这个问题,一律采用引用关系,但是潜在的风险仍然存在。

原文地址:https://www.cnblogs.com/yaohuiqin/p/9284612.html