专栏首页java技术大本营JDK14中record实践尝鲜

JDK14中record实践尝鲜

他来了他来了,小刀终于更新了

他来了他来了,不好意思, 他来晚了. 大家好, 我是小刀,前几天看到朋友圈被jdk14的GA版本刷屏了,我一直忍到现在才写,,,唉,实在是惭愧惭愧.

按道理讲啊,其实也不算晚吧, 因为之前写过一篇jdk14中 jpackage命令的使用. 原文如下:

首发! JDK14之jpackage命令尝鲜

今天,我们不仅仅是介绍新特性,还要实践起来!

好,下面我们就进入今天的主题-jdk14中的record的使用!!

原创不易, 帮忙点个在看吧!!!! 小刀这里谢谢您啦!!

使用形式

其实要是看代码编写的话,就一行

// 定义
record Image(@SerializedName("media_id") String mediaId){}
// 使用
Image image = new Image("传mediaId");
// 取里面的值
image.mediaId();

如上我定义了一个record,Image,里面有一个String mediaId 那按以前的写法呢,大致是这样的

static class ImageClass{
        // 定义一个属性
        private String mediaId;
        // 定义一个构造函数
        public ImageClass(String mediaId) {
            this.mediaId = mediaId;
        }
        // 定义一个get方法
        public String getMediaId() {
            return mediaId;
        }
    }

但是现在!!! 现在只要一行就可以搞定了!!! 真得是相见恨晚的感觉啊!!!

在做微信公众号开发的小伙伴应该有这种体验,那么多的嵌套实体类. 用map写吧, 不雅观, 用 static class 写吧, 马上一个文件就要好几百行了. 这时候如果领导同意的话,可以试试 jdk14 中的 record哦~~

(话说,,我们公司现在连jdk11还没有上,你们呢? )

运行配置

因为这个功能还在预览当中,所以需要一些额外的配置才能跑起来

idea

idea 需下载2020.1 RC 版本,然后在项目设置中,选择语言级别为14-preview,如下图所示

gradle

gradle需要升级到 6.3 及以后才支持jdk14, maven未验(已经很久没用maven了,gradle真香)

可使用如下命令进行升级:

./gradlew wrapper --gradle-version=6.3

build.gradle

在gradle的脚本文件中需要添加如下配置

tasks.withType(JavaCompile) {
  options.compilerArgs += "--enable-preview"
}

tasks.withType(Test) {
  jvmArgs += "--enable-preview"
}

tasks.withType(JavaExec) {
  jvmArgs += '--enable-preview'
}

最后一步把fastJson换成gson

下面我们用一个main函数演示一下

public static void main(String[] args) {
        record OutRecord(String name){
        }
        OutRecord outRecord = new OutRecord("xiaodao");
        // 直接对record序列化,都没有结果
        Gson gson = new Gson();
        System.out.println("gson:"+gson.toJson(outRecord));
        System.out.println("fastJson:"+JSON.toJSONString(outRecord));

        // 外面用个类包装一下
        Holder holder = Holder.init("xiaodao");
        System.out.println("gson:"+gson.toJson(holder));
        System.out.println("fastJson:"+JSON.toJSONString(holder));
    }
    // 来于包装的类
    static class Holder{
        // 声明一个record
        InnerRecord record;
        // 定义一个record
        record InnerRecord(String name){}

        /**
         * 推荐这种实例过种封状在类里面的写法
         * @param name
         * @return
         */
        public static Holder init(String name){
            Holder holder = new Holder();
            InnerRecord innerRecord = new InnerRecord(name);
            holder.record = innerRecord;
            return holder;
        }
    }

输出结果如下:

可以看到,不管是直接record还是外面有包装类的情况下, fastJson都不能序列化,但gson可以在外面有包装类的情况下进行序列化

撒花撒花! 本篇完结

关于record, 小刀觉得还是挺好用的, 只作值对象的话,几乎可以取代静态内部类了,代码简洁.嗯,,,可以自己实践下哦

今年的大环境确实不好, 不仅仅是应届的不好找工作, 我们在职的也天天提心吊胆. 但是呢, 这又不能和别人说,只能自己背负着前行, 别都压在自己心里了,来这里说一说吧. 全匿名的世界, 不用担心别人怎么看你, 你就是你, 心友们都在这等你❤️

本文分享自微信公众号 - java技术大本营(java-ideashare),作者:微笑的小小刀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java练习本(2019-07-06)

    String类型会指向堆内存中的存储空间,因此当通过==对String类型进行比较时,比较的是相应变量的地址。只要指向的是同一地址则两个String类型==比较...

    微笑的小小刀
  • JVM | OOP-Klass 二分模型

    oopsHierarchy: 描述了对象的表示层次,描述了klass的表示层次,并为OOPS指针oopDesc* 定义了别名

    微笑的小小刀
  • java练习本(2019-07-21)

    “ Love is the greatest refreshment in life. ”

    微笑的小小刀
  • 手撸实现UDP和TCP通信

    UDP是一种面向无连接的协议,因此传输过程中不能保证数据的完整性。jdk提供了网络通信包,在java.net包下提供了两个类DatagramPacket和Dat...

    Java旅途
  • 关于SQL表字段值缺失的处理办法

    在计算收益率时候,  收益率 = 收益 / 成本 一、如果成本为0,NULL,此时无法计算收益率; 方法: 1.将成本为0的数据 运算 (case when  ...

    互联网金融打杂
  • R语言学习笔记——柱形图

    今天分享R语言中的柱形图,所有图表语法都基于ggplot2包中的ggplot函数完成 。 其实R语言本身就带有各种作图函数,比如plot、bar、pie等,而且...

    数据小磨坊
  • 修改Windows 7 开机启动画面

    用户1456630
  • 修改Windows 7 开机启动画面

    Youngxj
  • SVN previous operation has not finished

    svn提交遇到恶心的问题,可能是因为上次cleanup中断后,进入死循环了。 错误如下: ? 解决方法:清空svn的队列 1.下载sqlite3.exe   ...

    hbbliyong
  • 印度议会选举,候选人用 DeepFake 伪造方言视频拉票

    内容概要:在近期举行的印度的德里议会选举中,一位候选人使用 DeepFake 技术,生成其他语言的宣传视频,为自己的团队拉取选票。该方式虽然取得了良好的宣传效果...

    HyperAI超神经

扫码关注云+社区

领取腾讯云代金券