实战小知识----02.05----Java杂谈(一)

102 阅读2分钟

这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

该篇主要用于记录起自己的日常细节,一些杂乱而又细思觉悟的小知识

switch

  1. switch,只能用int、short、char、enum或者byte, 作为参数,而String则会被转换为String.hashCode() , 也就是int型。
  2. Switch会根据分支条件转换成跳转指令,当分支条件较多的时候,会转换成跳转表 —— 也就是存储了分支和所在的代码块的地址。
  3. 跳转表高效的原因在于:
    • 编译器会对分支条件的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编译器一般也会将这两个方法转换成访问类变量。

  1. 虽然直接用函数调用参数是有成本的,而且把直接访问实例变量包装了一层,看上去是没有意义;
  2. 但是Java是遵循面向对象的语言,利用对象去操作,而且用private修饰符,可以保证数据的封装和调用
  3. 联想DDD中的充血模型,如果一个库存的金额字段修饰成public, 从技术角度也是不合理不安全的,应该用充血模型里面的减库存方法进行操作该字段;
  4. 正如平时的@Data,里面的get/set方法, 对于数据的保护,有些公司也是不允许使用的,一来是对于接手代码的同事插件依赖,二来就是对于所有的字段都开放set方法,不安全。