高质量编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011101777/article/details/72803144

1. 三目运算符尽量做到类型一致:

如:int i = 80;
String a = i < 100 ? 90:100; String b = i < 100 ? 90:100.00; 这里的a和b返回的值是不一样的,原因就是三目运算符中数据类型不一致,在其计算之前,就需要告诉编译器会返回某一类型的数据,当其数据类型不同时,有如下转换关系:
若两种数据类型不可转换,返回Object类型; 若可以转换:
1.是明确类型的表达式(比如变量),int转long,long转float,float转double,以此类推;
2.两数据类型存在包含关系,则转换为范围更广泛的那个类型;

2. 警惕自增陷阱:

int count = 0; for(int i =0;i < 10;i++){
count = count++; } 改代码块执行后,count的值仍然是0;因为 count = count++;这句代码等价于如下代码: int a = count;//属于值拷贝 count ++; return a;

3.合理使用静态导入:

1.静态引用应该导入需要使用的资源,不要滥用*通配符;
2.自定义的方法和常量等不要和导入的相关资源重名或者容易引起误解;

4.序列化

1.实现自Serializable的序列化类应尽可能主动声明一个UID,当序列化后的资源被更改之后,UID能兼容旧的版本,不至于反序列化时出现异常的情况。
2.序列化是保存的对象的状态,所以不会保存被static修饰的变量。
3.transient(瞬态变量)修饰的变量也不会被保存;
4.序列化具有传递性,父类实现Serializable后子类就能被序列化,反之不可以;如果序列化的属性是对象,则这个对象也必须实现Serializable接口(有点像clone方法对应的处理原则);
5.一个非静态,非瞬态且被final修饰的基本类型成员(通过new 关键字创建的String除外),当其是简单赋值时,在反序列化的时候会被重新赋值。如果是通过方法赋值,则不会被重新赋值
6.反序列化的时候不会调用构造函数:

这里写图片描述

5.instanceof关键字

1.instanceof只能用于具有继承和实现关系的对象判断,不能用于基本类型判断;
2.null经过类型转换后仍然是空;

6.泛型只存在于编译期;
7.对于final修饰的基本类型和String,编译器会认为其是稳定的,所以在编译期会将相关的值直接编译到字节码中,即值引用,避免运行期引用。
8.判断数采用偶判断不用奇判断;
9.优先使用整型池,注意整型边界;
10.数字类型转换时,只能先扩展其范围,再转换为相关包装类型(包装类型注意null值),比如:

int –> long –>Long //这样是可以的 int –>Long //不可以

11.不要随意设置随机数种子,这样会导致在一个机型上每次运行和产生相同的随机数;

猜你喜欢

转载自blog.csdn.net/u011101777/article/details/72803144