Java 14 祭出代码简化大器,Lombok 要被干掉了?
Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章:
http://www.javastack.cn/article/2020/java14-has-been-released/
栈长之前也陆续分享过两篇 Java 14 的新特性:
感觉很好玩,今天再来分享一个新特性:
JEP 359: Records (Preview)
Java 14 祭出大器啊!!!
背景介绍
我们经常听到一些对 Java 的抱怨,"Java 太冗长啰嗦了",Java 确实经常要写很多低级(low)的代码,比如: constructors, getters, equals(), hashCode(), toString() 方法等,是不是感同身受?
如果开发人员为了偷懒而省略其中的某些方法,甚至会带来问题。
基本介绍
Records 是一种新的类申明形式,和枚举类型一样,它是一种受限制的类(class)。
简单来说,Records 就是一种新的语法糖,目的还是为了简化代码,相当于 Lombok 的 @Data
注解,但又不能完全替代,现在还是个预览特性,在未来可能会有变更。
Lombok介绍及使用:
Records 的语法是:
record Point(int x, int y) { }
用 record 修饰一个类,括号里面直接带参数,{}
里面是可选的。
到底有啥用呢?
最好理解它的方式就是实践,下面栈长通过一个示例带大家来了解下。
实践分析
怎么安装 Java 14 及环境配置这篇就不说了。
下面是一个示例:
public record Student(String name, int id, int age) {}
没错,一行搞定(public 都可以省略),就是这么简单粗暴!!!
再来看下它的类继承结构图:
我们再通过 IDEA 反编译 class 类的方式来看下它到底做了什么:
看完是不是有点 Lombok 的感觉?
1)生成的类是 final 类型的,并且继承了:java.lang.Record
;
2)生成的类成员变量全是 private final 类型的;
3)自动生成了类构造器、toString()、hashCode()、equals(),以及类似 getter
的变量访问方法;
由于工具编译器的问题,上边看到的部分源代码是 /* compiled code */
,我们再在 Student 类里面加入 main 方法测试下:
public record Student(String name, int id, int age) {
public static void main(String[] args) {
Student student1 = new Student("栈长", 1001, 18);
System.out.println(student1.name());
System.out.println(student1.id());
System.out.println(student1.age());
System.out.println(student1);
Student student2 = new Student("栈长", 1001, 18);
Student student3 = new Student("栈长", 1003, 18);
System.out.println(student1.equals(student2));
System.out.println(student1.equals(student3));
}
}
输出结果:
栈长
1001
18
Student[name=栈长, id=1001, age=18]
true
false
从结果可以得知 toString/ equals 等生成的方法都按照特定的规则重写了,而不是使用内存地址。
可以添加成员变量吗?
不能,Records类里面不能手动加成员变量。
比如,加一个地址成员变量就编译报错了:
可以代替 Lombok 吗?
答案是:不能完全代替!
从上面的结论我们可以得知 Records 类有以下限制:
1)record 类是 final 修饰的,所以不能被其他子类继承;
2)因为 Java 类是单继承,而自身又已经继承了 Record 类,所以不能再继承其他类,但是可以实现接口;
3)成员变量也是 final 类型的,所以其值或者引用不能被更改,如果是引用类型,可以修改对象里面的值。
由于它的这些限制,想完全代替 Lombok 是不可能的,当然,不用纠结这些限制的话,某些场合是可以代替 Lombok 使用的。
总结
Java 14 Records 是一个新的语法糖,是一种 "数据载体",可以告别传统的低效的生成代码模板,现在还是预览特性,栈长我也会持续跟进,公众号第一时间推送,如果你也喜欢研究新技术,有兴趣的可以微信搜索 "Java技术栈" 关注下。
虽然现在也存在诸多限制,至少 Java 正在大步往前走,变得越来越智能、越来越简化了。
可能有些人会说,没卵用,Lombok 足已!
现在来说确实无法反驳,但是我觉得有朝一日 Java 总会干掉 Lombok,因为,Records 有十足的优势,它是 Java 自带的语法,不需要包装插件,Lombok 是团队工具,不一定都会用,你要知道,有些公司是禁止使用 Lombok 插件的。
最后,本文仅供 Java 爱好者了解、学习即可,不能用于生产,出去吹牛逼还是可以的。
有什么问题欢迎留言讨论~
推荐去我的博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
觉得不错,别忘了点赞+转发哦!
Java 14 祭出代码简化大器,Lombok 要被干掉了?的更多相关文章
- Java代码简化神器-Lombok
一.背景 前段时间在开源社区中发现了一个比较牛逼的简化Java代码的神器-Lombok,接着自己写了demo进行测试和练习,感觉真的很不错,特此分享给需要的小伙伴们~ 二.开发之前的准备 1.lomb ...
- Java 14 发布了,可以扔掉Lombok了?
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...
- Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- Java 14 可能带来什么新特性?
JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ...
- JDK/Java 14 发布
3 月 17 日,JDK/Java 14 正式 GA. 此版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 13 加起来的还要 ...
- Java 14带来了许多新功能
本文是作者翻译自java magazine的文章,我也将回持续的关注java的最新消息,即时和大家分享.如有翻译不准确的地方,欢迎大家留言,我将第一时间修改. Java 14包含比前两个发行版更多 ...
- 【机器学习实战】第14章 利用SVD简化数据
第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...
- Java 14 令人期待的 5 大新特性,打包工具终于要来了
随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. Java 13刚刚发布给开发人员使用不久,最新版本的JDK于2019年9月发 ...
- Java 14 有哪些新特性?
记录为 Java 提供了一种正确实现数据类的能力,不再需要为实现数据类而编写冗长的代码.下面就来看看 Java 14 中的记录有哪些新特性. 作者 | Nathan Esquenazi 译者 | 弯月 ...
随机推荐
- C++编程入门--No.6
题目:用*号输出字母C的图案. 程序分析:可先用'*'号在纸上写出字母C,再分行输出. #include <bits/stdc++.h> using namespace std; int ...
- P3807【模板】卢卡斯定理
题解大部分都是递归实现的,给出一种非递归的形式 话说上课老师讲的时候没给代码,然后自己些就写成了这样 对于质数\(p\)给出卢卡斯定理: \[\tbinom{n}{m}=\tbinom{n \bmod ...
- andorid jar/库源码解析之EventBus
目录:andorid jar/库源码解析 EventBus: 作用: 用于不同Activity,Service等之间传递消息(数据). 栗子: A页面:onCreate定义 EventBus.ge ...
- 网络流二十四题,题解summary
没有全部写完,有几题以后再补吧. 第一题:最简单的:飞行员配对方案问题 讲讲这个题目为什么可以用网络流? 因为这个题目是要进行两两之间的匹配,这个就可以想到用二分图匹配,二分图匹配又可以用网络流写. ...
- Coursera课程笔记----计算导论与C语言基础----Week 5
从现实问题到计算机程序(Week 5) 总结回顾 计算机只能按照程序去执行,不可能自己"想出"一个解决问题的方法 面对一个问题,你必须自己找到解决方案,才有可能做出相应的程序 所以 ...
- 并发工具类——Semaphore
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Semaphore([' seməf :(r)])的主要 ...
- C# 委托delegate的基本用法
委托:就是一个方法的类型,下面3个调用情况来详细熟悉一下: 1.调用组合委托 //委托:就是一个方法的类型 public delegate int TestDelegateStr(); public ...
- ScrollView 内嵌百度地图问题解决
在ScrollView上内嵌百度地图遇到两个问题 事件冲突,移动地图的时候屏幕滚动了 移动ScrollView的时候,百度地图出现黑边 问题1的处理就有各种办法了,核心都是拦截事件,我使用的办法是加一 ...
- 读懂这几个关键词,你就能了解 Docker 啦
基于高度虚拟化所诞生的容器技术,如今已经走向大规模应用.那么容器.虚拟机.Docker.Openstack.Kubernetes 之间又有什么关系,对现在的选择有什么影响呢? 上世纪 60 年代,计算 ...
- 3.3 Go浮点型
1.Go浮点型 Go 语言提供了两种精度的浮点数,float32 和 float64,编译器默认声明为float64 小数类型就是存放小数的,如1.2 0.005 -2.32 package main ...