目录
一、JDK关注的新特性
1.1搭建学习环境
JDK:JDK19
OpenJDK: https://jdk.java.net/19/ Liberica JDK: https://bell-sw.com/pages/downloads/ , 是一个OpenJDK发行版,为云原生,容器特别优化。
Maven:构建和依赖管理,版本选择3.6以上
配置本地仓库和阿里云镜像
IDEA2022.3.1Ultimate:主要的开发工具,我是30天试用版本
数据库:MySQL 5以上版本
火狐浏览器:版本用比较新的,中文版本。
文本工具:EditPlus, Sublime任意。
1.2有用的新特性
JDK8-19新增了不少新特性,这里我们把实际常用的新特性,给大家介绍一下。 包括以下几个方面:
- Java Record
- Swich开关表达式
- Text Block文本块
- var 声明局部变量
- sealed 密封类
1.2.1 Java Record
Java14中预览的新特性叫做Record,在Java中,Record是一种特殊类型的Java类。可用来创建不可变类,语法简短。参考JEP 395. Jackson 2.12支持Record类。
任何时候创建Java类,都会创建大量的样板代码,我们可能做如下:
- 每个字段的set,get方法
- 公共的构造方法
- 重写hashCode, toString(), equals()方法
Java Record避免上述的样板代码,如下特点:
- 带有全部参数的构造方法
- public访问器
- toString(),hashCode(),equals()
- 无set,get方法。没有遵循Bean的命名规范
- final类,不能继承Record,Record为隐士的final类。除此之外与普通类一样
- 不可变类,通过构造创建Record
- final属性,不可修改
- 不能声明实例属性,能声明static成员
IDEA创建新的Maven工程 Lession01-feature
1.2.1.1 看看Record怎么用
IDEA新建Class,选择类Record
step1: 创建Student Record
public record Student(Integer id,String name,String email,Integer age) { }
step2:创建Record对象
public static void main(String[] args) {
Student lisi = new Student(1001, "lisi","lisi@qq.com",20);
System.out.println("lisi = " + lisi.toString());
Student zhangsan = new Student(1002, "zhangsan","lisi@qq.com",20);
System.out.println("zhangsan = " + zhangsan.toString());
System.out.println("lisi.equals(zhangsan) = " + lisi.equals(zhangsan));
System.out.println("lisi.name() = " + lisi.name());
System.out.println("zhangsan.name() = " + zhangsan.name());
}
现在能查看控制台输出:
lisi = Student[id=1001, name=lisi, email=lisi@qq.com, age=20] zhangsan = Student[id=1002, name=zhangsan, email=lisi@qq.com, age=20] lisi.equals(zhangsan) = false lisi.name() = lisi zhangsan.name() = zhangsan
Record通过构造方法创建了只读的对象,能够读取每个属性,不能设置新的属性值。 Record用于创建不可变的对象,同时减少了样板代码。
Record对每个属性提供了public访问器,例如lisi.name()
1.2.1.2 Instance Methods
Record是Java类,和普通Java类一样定义方法。下面定义方法concat,将姓名和年龄一起打印输出。 我们创建普通的方法concat,将name和age连接为一个字符串输出。
step1:创建实例方法
public record Student(Integer id,String name,String email,Integer age) {
public String concat(){
return String.format("姓名:%s,年龄是:%d", this.name,this.age);
} }
step2: 调用实例方法
public static void main(String[] args) {
Student lisi = new Student(1001, "lisi","lisi@qq.com",20);
String nameAndAge = lisi.concat();
System.out.println( nameAndAge);
}
最后控制台输出: 姓名:lisi,年龄是:20
1.2.1.3静态方法 Static Method
Record类定义静态方法,试用静态方法与普通类一样。
step1: 创建静态方法
public record Student(Integer id,String name,String email,Integer age) {
public String concat(){
return String.format("姓名:%s,年龄是:%d", this.name,this.age);
}
/** 静态方法 */
public static String emailUpperCase(String email){
return Optional.ofNullable(email).orElse("no email").toUpperCase();
} }
step2:测试静态方法
public static void main(String[] args) {
String emailUpperCase = Student.emailUpperCase("lisi@163.com"); System.out.println("emailUpperCase = " + emailUpperCase);
}
1.2.1.4 Record的构造方法
我们可以在Record中添加构造方法, 有三种类型的构造方法分别:是紧凑的,规范的和定制构造方法
- 紧凑型构造方法没有任何参数,甚至没有括号。
- 规范构造方法是以所有成员作为参数
- 定制构造方法是自定义参数个数
step1: 紧凑和定制构造方法
public record Student(Integer id,String name,String email,Integer age) { /紧凑构造方法/
public Student {
System.out.println("id"+ id );
if( id < 1 ){
throw new RuntimeException("ok");
}
}
/自定义构造方法/
public Student(Integer id, String name) {
this(id, name, null, null);
} }
step2:编译Student.java -> Student.class
public record Student(Integer id, String name, String email, Integer age) { /** 紧凑构造方法和规范构造方法合并了 */
public Student(Integer id, String name, String email, Integer age) {
System.out.println("id" + id);
if (id < 1) {
throw