从Java8到Java17(七)

295 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

天下文章一大抄。这句话放哪都没错,并不是贬义,技术的进步总是螺旋上升的,每一次更新迭代都会基于前人的工作基础,每次都是从头到尾的革命性创新是不可能的,也没必要。那么今天要讲的就是一个在Java14中预览,Java16正式发布的特性:Record类型。

首先如果你了解过一点点kotlin,这个Record类型跟kotlin中的data class十分类似,甚至我感觉命名上kotlin更友好一些,可以很直观的了解是干嘛的。相比之下,Record就是显的有些隐晦。如果你恰好没接触过kotlin,只写Java的话,那你一定知道lombok这样的插件存在。没错,Record类型就是官方的lombok插件。Record类会生成get/set/hashcode/equals和构造方法,没有多余的注解和代码。写法上跟data class如出一辙,可以说除了改了个名字,别的是一模一样。

public record EmployeeRecord(Long id, 
		String firstName, 
		String lastName, 
		String email, 
		int age) {
	
}

这就是一个record类,甚至可以不用写class关键字。不仅可以是一个单独的类文件,也可以是一个成员类:

public class EmployeeRecord { 
    public record User(long id, String name, int age) {} 
 }

这样应对多个临时dto,vo之类的数据时就可以写在一个类里面了。还可以出现在方法里:

public class EmployeeRecord { 
        public void test() { 
            record Mail (long id, String content){} 
            Mail mail = new Mail(10, "content"); 
           } 
        }

作为一个临时数据类,在一些灵活的场景下会有用武之处。

需要注意的几点

  1. 构造函数 默认record类具有全部属性的构造函数

  2. 属性 属性最好在类声明时就写在括号中,如果想在body中单独声明,仅支持static属性,不建议这样

  3. 不能被继承 record类不能被继承

官方设计record类的初衷就是当作一个数据类,不要再出现什么dto,form,vo等等之类的类了,而且还在类上写一堆乱糟糟的注解。更简洁,更实用。