Java开发之规范
1.显示声明UID
所有可序列化类都显示声明serialVersionUID值,若不显示声明,系统会默认生成一个UID,这样在这个对象进行序列化与反序列的时候,如果对java培训象添加一个属性或者删除一个属性,那么默认的UID也会发生改变,也就会导致反序列化时候就会出现: java.io.InvalidClassException
案例分析
创建一个Person类,定义两个属性name,age。通过redis进行缓存对象序列化后的byte[]。然后在修改Person类属性,增加或删除一个属性,比如增加一个address属性。再反序列之前存储在redis缓存的byte[]。会出现反序列化失败(ps:这边只是演示效果)
public class UIDTest {
public static void main(String[] args) {
try {
//第一步存储序列化后的对象
Person person = new Person("jack2", 21);
RedisUtils.stringSetBit("jack2", serializeObj(person));
//第二步,增加修改Person类属性,进行反序列化
Person p1 = (Person) deserialize(RedisUtils.byteGet("jack2"));
System.out.println(p1);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static byte[] serializeObj(Object obj) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream ot = new ObjectOutputStream(os)) {
ot.writeObject(obj);
return os.toByteArray();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
public static Object deserialize(byte[] bytes) {
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream
(inputStream)) {
return objectInputStream.readObject();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
? idea创建设置,开启缺少UID提示
文章图片
2.校验包装类型是否为null
Java引入包装类型是为了解决基本类型无法实例化的问题,便于让一个基本类型也能参加到面向对象的编程世界中。由于包装类型的默认值是null,所以为了防止万恶的java.lang.NullPointerException错误,所以在使用包装类型时候,必须要校验包装类型是否为null
提示
? 【强制】所有的POJO类属性必须使用包装数据类型
? 【强制】RPC方法的返回值和参数必须使用包装数据类型
? 【推荐】所有的局部变量使用基本数据类型
【Java开发之规范】3.用BigDecimal表示金额
java.math.BigDecimal是专门为了弥补浮点型无法精确计算的缺憾而设计的类,并且它本身也提供了加减乘除的常用数学算法。特别是与数据库Decimal类型的字段映射的。而如果是财务运算,更加应该使用BigDecimal类型来表示金额。并且尽量使用String类型的构造函数。
文章图片
4.POJO类覆写toString()
覆写POJO类的toString(),因为Java提供的默认的toString方法不友好,打印出来看不懂。尤其在实际开发过程中,当方法抛出异常的时候,调用下POJO的toString()方法打印出属性值。便于问题排查。推荐使用:apache的commons工具包中ToStringBuilder类
文章图片
5.工具类不可实例化
实际项目中,避不可免,要写一些Utils类。但是在写这些工具类的时候,要让工具类不可实例化。因为这些工具类只是提供了一些通用的非业务领域的公用方法,没有额外的属性,我们仅仅调用定义的方法。所以没有必须让其实例化。
? 优秀代码欣赏
文章图片
6.优先使用StringBuilder
在频繁进行字符串的运算(如拼接、替换、删除等),优先考虑StringBuilder,如SQL语句的拼装、Json的封装等等。
7.指定集合的初始化大小
我们在使用ArrayList、HashMap等集合的时候,一般都是直接: ArrayListstrs = new ArrayList<>(); 然后进行add、remove等方法进行操作,因为在它的特性就是动态管理长度的。所以我们无须担心超出长度的问题。但是为了写出高效的代码,必须明确指出集合初始化大小。
? 源码查看
文章图片
文章图片
8.资源对象、流对象及时回收
对于数据库资源、文件操作、流操作需要及时进行close。Java7以上,可以使用语法:try-with-resources可以实现自动关闭资源对象。
文章图片
9.用ThreadPoolExecutor创建线程池
在实际开发中,在处理多任务的情况下,通常想到为了节约处理时间,需要使用多线程技术来缩短时间。那么在编写高质量Java代码,需要使用ThreadPoolExecutor来显示创建线程池。
文章图片
10.让注释正确、清晰、简洁
? 1.类、属性、方法的注释必须使用Javadoc规范,使用/*xxx/格式
? 2.所有抽象方法(包括接口方法)除了返回值、参数、异常还需要要指出该方法做什么事情,实现什么功能
? 3.所有的类必须添加创建者和创建日期
? 4.方法内的注释必须在被注释语句的上方,不能跟在注释语句后面
? 5.所有枚举类型必须要有注释,说明每个数据项的用途
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 开学第一天(下)
- 20170612时间和注意力开销记录
- 深入理解Go之generate
- 开花店的前景怎么样()
- 眉头开了
- 上班后阅读开始变成一件奢侈的事
- 小影写在2018九月开学季
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 事件代理