当前位置: 首页 > 后端技术 > Java

快速且无副作用地构建Java17环境并使用录制功能

时间:2023-04-02 09:09:02 Java

Java17现已发布。很多同学跃跃欲试,但又担心配置新的JDK会影响当前的项目环境。今天介绍一种项目级的JDK配置方法。让你在不影响原有项目的情况下,提前一步快速上手Java17。该项目快速集成了Java17。在发布本文之前,Amazon的CorrettoJDK17和ZuluJDK17已经加入了豪华午餐。选择好之后就可以下载Java17的JDK了,可能是刚发布的缘故,速度太慢了。于是直接去OpenJDK官网下载了一份JDK17。解压到当前Windows用户文件夹路径(我的是C:\Users\n1\.jdks),之所以解压到.jdks是因为IDEA的下载目标文件夹就是这个文件夹,方便IDEA自动检出.这里不需要重新配置Java环境变量,都是项目级别的Java版本控制,不会影响你的其他项目。然后新建一个Maven项目(也可以是普通项目,也可以是Gradle项目),这时候玩的可不爽了。你需要确定两件事。语言级别调整JDK的语言级别为Java17,在IDEA下按快捷键Ctrl+Alt+Shift+S调出如下对话框,将LanguageLevel改为17。编译器的字节码版本也需要调整为17。在IDEA中,按快捷键Ctrl+Alt+S修改图中的位置。RecordClass完成环境配置后,我们就开始尝试最直观也是比较好用的语法糖Record。准确地说,这并不是Java17的新特性,它最早出现在Java14中,成为Java16中的正式特性。但是,作为一个LTS版本,这仍然是一个非常重要的概念。直观一点,数据类的传统写法是:publicclassMyRecord{privatefinalStringusername;私人最终整数年龄;publicMyRecord(Stringusername,Integerage){this.username=username;这个。年龄=年龄;}publicStringusername(){返回用户名;}publicIntegerage(){返回年龄;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;如果(o==null||getClass()!=o.getClass())返回false;MyRecordoldRecord=(MyRecord)o;returnObjects.equals(username,oldRecord.username)&&Objects.equals(age,oldRecord.age);}@OverridepublicinthashCode(){returnObjects.hash(username,age);}@OverridepublicStringtoString(){return"MyRecord["+"username='"+username+'\''+",age="+age+']';}}使用Record可以简化为:publicrecordMyRecord(Stringusername,Integerage){}这样大大减少了一些模板代码,逻辑更清晰简单RecordisimmutableRecord用于设计和传输不可变数据。从上面的例子可以看出,一个Record类初始化后,里面的属性是不能改变的。没有Setter方法而是通过全参数构造来初始化数据,天然是线程安全的。Record的超类所有用Record关键字声明的类都是java.lang.Record的子类,有点像枚举。publicabstractclassRecord{protectedRecord(){}@Overridepublicabstractbooleanequals(Objectobj);@OverridepublicabstractinthashCode();@OverridepublicabstractStringtoString();}从这里也可以看出,所有的Record实现都覆盖了equals、hashCode、toString这三个方法。如何判断一个类是Record类?传统方法:Record.class.isAssignableFrom(MyRecord.class)JDK提供了一个新的方法来解决这个问题:MyRecord.class.isRecord()录课。RecordComponent[]recordComponents=MyRecord.class.getRecordComponents();记录不能使用extends关键字。由于Record类的唯一隐式超类是java.lang.Record,因此Java不支持多重继承。使用extends显式定义会导致编译错误。无法定义额外的成员变量Record类的成员变量只能通过构造来声明。所以下面的写法是错误的:publicrecordMyRecord(Stringusername,Integerage){priviteStringgender;}但是可以在Record类中定义静态变量。定义方法时需要小心。定义方法是比较开放的,但是请确保你定义的方法不会破坏Record的不可变意义。不推荐定义Setter方法。另外注意Record类的Getter方法不是setXXXX的格式。使用注解时唯一要注意的是,在Record类的成员变量上使用注解可能会影响Getter方法。像这样:publicrecordMyRecord(@DeprecatedStringusername,Integerage){}编译后:publicrecordMyRecord(Stringusername,Integerage){publicMyRecord(@DeprecatedStringusername,Integerage){this.username=username;这个。年龄=年龄;}publicStringgetUsername(){returnthis.username;}/**@deprecated*/@DeprecatedpublicStringusername(){returnthis.username;}publicIntegerage(){returnthis.age;}}具体范围需要根据注解上@Target元注解的定义域来确定。小结今天介绍了如何在不影响已有项目的情况下快速集成Java17。借此机会对Record类进行介绍和解释,希望对刚接触这个新定义的你有所帮助。原创不易,请多多关注,点赞,重看,转发。关注公众号:Felordcn获取更多资讯个人博客:https://felord.cn