这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战
该篇主要用于记录起自己的日常细节,一些杂乱而又细思觉悟的小知识
switch
- switch,只能用int、short、char、enum或者byte, 作为参数,而String则会被转换为String.hashCode() , 也就是int型。
- Switch会根据分支条件转换成跳转指令,当分支条件较多的时候,会转换成跳转表 —— 也就是存储了分支和所在的代码块的地址。
- 跳转表高效的原因在于:
- 编译器会对分支条件的int进行排序(这也就是switch需要限定参数类型的原因)
- 排序后可以利用高效的二分查找
- 如果条件是连续的,那么跳转表会优化成数组,并且通过下标找到对于的代码地址
- 即使条件参数不是连续的,但是数字比较密集,也会优化成数组,并且把找不到的值指向default
类的访问
public class User {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
上述的get/set方法可能看上去有点多余,而且刚入门的小伙伴可能也会觉得,规范需要这么写,存在即合理。而且,直接访问 类变量岂不是更快?而且Java编译器一般也会将这两个方法转换成访问类变量。
- 虽然直接用函数调用参数是有成本的,而且把直接访问实例变量包装了一层,看上去是没有意义;
- 但是Java是遵循面向对象的语言,利用对象去操作,而且用private修饰符,可以保证数据的封装和调用
- 联想DDD中的充血模型,如果一个库存的金额字段修饰成public, 从技术角度也是不合理不安全的,应该用充血模型里面的减库存方法进行操作该字段;
- 正如平时的@Data,里面的get/set方法, 对于数据的保护,有些公司也是不允许使用的,一来是对于接手代码的同事插件依赖,二来就是对于所有的字段都开放set方法,不安全。