首页 文章 精选 留言 我的

精选列表

搜索[机器学习系统],共10000篇文章
优秀的个人博客,低调大师

我Java8还没用呢,又让我学习Java14

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 第14版包含的JEP(Java Enhancement Proposals,Java增强提案)比12版和13版加起来还要多。在这篇文章中,我将主要讨论以下几点: 改进的switch表达式,第一次出现在Java 12和13中,在Java 14中获得了完全的支持 instanceof支持模式匹配(语言特性) NullPointerException(JVM特性) 希望你在阅读完本文后,积极地代码中实验这些功能,为Java团队提供反馈,并为Java的发展做出贡献。 一、Switch表达式 java 14 中的switch表达式将会永久存在。 在之前的发布中,switch表达式只是一个“预览”阶段的特性。我想提醒一下,“预览”阶段的特性的目的是为了收集反馈,这些特性可能会随时改变,根据反馈结果,这些特性甚至可能会被移除,但通常所有的预览特性最后都会在java中固定下来。 新的switch表达式的优点是,不再有缺省跳过行为(fall-through),更全面,而且表达式和组合形式更容易编写,因此出现bug的可能性就更低。例如,switch表达式现在可以使用箭头语法,如下所示: [var log = switch (event) { case PLAY -> "User has triggered the play button"; case STOP, PAUSE -> "User needs a break"; default -> { String message = event.toString(); LocalDateTime now = LocalDateTime.now(); yield "Unknown event " + message + " logged on " + now; } };]() 二、文本块 Java 13引入的一个预览功能是文本块。有了文本块,多行的字符串字面量就很容易编写了。这个功能在Java 14中进行第二次预览,而且发生了一些变化。例如,多行文本的格式化可能需要编写许多字符串连接操作和转义序列。下面的代码演示了一个HTML的例子: String html = "<HTML>" + "\n\t" + "<BODY>" + "\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" + "\n\t" + "</BODY>" + "\n" + "</HTML>"; 有了文本块,就可以简化这一过程,只需使用三引号作为文本块的起始和结束标记,就能编写出更优雅的代码: String html = """ <HTML> <BODY> <H1>"Java 14 is here!"</H1> </BODY> </HTML>"""; 与普通字符串字面量相比,文本块的表达性更好。更多的内容可以参考这篇文章 (https://blogs.oracle.com/javamagazine/text-blocks-come-to-java)。 Java 14引入了两个新的转义序列。第一,可以使用新的 s 转义序列来表示一个空格。第二,可以使用反斜杠 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。 例如,现在编写多行字符串的方式如下: String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing " + "elit, sed do eiusmod tempor incididunt ut labore " + "et dolore magna aliqua."; 在文本块中使用 转义序列,就可以写成这样: String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed do eiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """; 三、instanceof的模式匹配 Java 14引入了一个预览特性,有了它就不再需要编写先通过instanceof判断再强制转换的代码了。例如,下面的代码: if (obj instanceof Group) { Group group = (Group) obj; // use group specific methods var entries = group.getEntries(); } 利用这个预览特性可以重构为: if (obj instanceof Group group) { var entries = group.getEntries(); } 由于条件检查要求obj为Group类型,为什么还要像第一段代码那样在条件代码块中指明obj为Group类型呢?这可能会引发错误。 这种更简洁的语法可以去掉Java程序里的大多数强制类型转换。 JEP 305解释了这项改变,并给出了Joshuoa Bloch的著作《Effective Java》中的一个例子,演示了下面两种等价的写法: @Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString) && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); } 这段代码中冗余的CaseInsensitiveString强制类型转换可以去掉,转换成下面的方式: @Override public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); } 这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。这正是instanceof操作符的用例,因为条件就是类型检查,提取操作需要调用适当的方法,或访问特定的字段。 换句话说,该预览功能仅仅是个开始,以后该功能肯定能够减少更多的代码冗余,从而降低bug发生的可能性。 四、Record 另一个预览功能就是record。与前面介绍的其他预览功能一样,这个预览功能也顺应了减少Java冗余代码的趋势,能帮助开发者写出更精准的代码。Record主要用于特定领域的类,它的位移功能就是存储数据,而没有任何自定义的行为。 我们开门见山,举一个最简单的领域类的例子:BankTransaction,它表示一次交易,包含三个字段:日期,金额,以及描述。定义类的时候需要考虑多个方面: 构造器 getter方法 toString() hashCode()和equals() 这些部分的代码通常由IDE自动生成,而且会占用很大篇幅。下面是生成的完整的BankTransaction类: public class BankTransaction { private final LocalDate date; private final double amount; private final String description; public BankTransaction(final LocalDate date, final double amount, final String description) { this.date = date; this.amount = amount; this.description = description; } public LocalDate date() { return date; } public double amount() { return amount; } public String description() { return description; } @Override public String toString() { return "BankTransaction{" + "date=" + date + ", amount=" + amount + ", description='" + description + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BankTransaction that = (BankTransaction) o; return Double.compare(that.amount, amount) == 0 && date.equals(that.date) && description.equals(that.description); } @Override public int hashCode() { return Objects.hash(date, amount, description); } } Java 14提供了一种方法可以解决这种冗余,可以更清晰地表达目的:这个类的唯一目的就是将数据整合在一起。Record会提供equals、hashCode和toString方法的实现。因此,BankTransaction类可以重构如下: public record BankTransaction(LocalDate date, double amount, String description) {} 通过record,可以“自动”地得到equals,hashCode和toString的实现,还有构造器和getter方法。 要想尝试这个例子,需要用preview标志编译该文件: javac --enable-preview --release 14 BankTransaction.java record的字段隐含为final。因此,record的字段不能被重新赋值。但要注意的是,这并不代表整个record是不可变的,保存在字段中的对象可以是可变的。 请继续关注该功能。从培养新一代的Java开发者的视角来看,Record也很有意思。例如,如果你要培养初级开发者,那么record应该什么时候讲呢?是在讲OOP之前还是之后? 五、NullPointerException 一些人认为,抛出NullPointerException异常应该当做新的“Hello World”程序来看待,因为NullPointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码: var name = user.getLocation().getCity().getName(); 在Java 14之前,你可能会得到如下的错误: Exception in thread "main" java.lang.NullPointerException at NullPointerExample.main(NullPointerExample.java:5) 不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回null。实际上,变量user也可能是null。因此,无法判断是谁导致了NullPointerException。 在Java 14中,新的JVM特性可以显示更详细的诊断信息: Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is null at NullPointerExample.main(NullPointerExample.java:5) 该消息包含两个明确的组成部分 后果:Location.getCity()无法被调用 原因:User.getLocation()的返回值为null 增强版本的诊断信息只有在使用下述标志运行Java时才有效: -XX:+ShowCodeDetailsInExceptionMessages 下面是个例子: java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample 在以后的版本中,该选项可能会成为默认。 这项改进不仅对于方法调用有效,其他可能会导致NullPointerException的地方也有效,包括字段访问、数组访问、赋值等。 六、总结 Java 14提供了几个新的预览版语言特性和更新,能很好地帮助开发者完成日常工作。Java 14还引入了record,这是一种创建精确数据类的新方法。此外,NullPointerException的消息经过了改进,能显示明确的诊断信息。switch表达式也成了Java 14的一部分。文本块功能可以帮你处理多行字符串,这是在引入了两个新的转义序列之后的另一预览功能。还有一项改动就是JDK Flight Recorder的事件流。 可见,Java 14带来了许多创新。你应该尝试一下这些功能,然后反馈给Java的开发团队。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-03-14本文作者:Raoul-Gabriel Urma本文来自:“互联网架构师公众号”,了解相关信息可以关注“互联网架构师”

优秀的个人博客,低调大师

【个人学习JAVA---学后的梳理】三、浅纳Java的数据类型

Java数据类型的简单归纳打理,顺带补上 常量与变量 1. 编程元素---常量与变量 1.1:常量 顾名思义,常量就是固定不变的量(不变的是其直接对象地址),即:定义完成就无法被改变。 声明常量的语法如下: final <数据类型> <常量名>[=赋值]; 进一步说明,常量的名称就采用全大写字母,以便区分于其他变量。其中定义的关键字final,不仅定义于变量,还用于定义类的成员方法,这就意味着被final定义的方法将不会再被改变。 1.2: 变量 变量是利用声明的方式,将内存中的某个块保留下来供该程序使用。 不管变量的值如何更改,所指向的,使用的,都是同一内存空间。变量的作用范围:作用范围,也就是意味着在范围内,该变量名才会有意义、有作用。 那么,不同范围内的变量名是可以存在重名的,程序的运行时访问原则是就近原则,向上查找该变量名。 在一个类中,变量根据范围,有两种类型: 成员变量类主体中定义的变量为成员变量。其作用范围是在整个类都能访问到。 局部变量在某个方法,某个代码块,某个循环里所定义的变量,其只在这些局部的范围内有意义。 2. Java的数据类型 在Java中规定了8种基本数据类型,也存在引用类型的数据类型。如下图示: 图1-Java数据类型图 2.1:8种基本数据类型 数据类型 说明 位 可表示的数据范围 默认初值 long 长整数 64 能保存宇宙中最大的整数(正负) 0L int 整数 32 -2147483648 ~ 2147483647 0 short 短整数 16 -32768 ~ 32767 (short)0 byte 位 8 -128 ~ 127 (byte)0 char 字符 2 0~255 u000(空) float 单精度 32 可有6、7个小数位的精确度 0.0f double 双精度 64 可有15个小数位的精确度 0.0d 2.1.1: byte类型 1个字节有8位。 byte类型数据占据1个字节的内存空间。 2.1.2. short类型 赋值整数前以"(short)"表示该整数类型是short类型,否则是int型。 short类型数据占据2个字节的内存空间。 2.1.3: int类型 Java中默认的整数数据类型就是int型。数据溢出时,溢出的数值将与该类型的最小数值相加后再赋值。也就是说,MAX_VALUE+n后的值是MIN_VALUE+[n-1]。 int类型数据占据4个字节的内存空间。 2.1.4: long类型 long类型数据占据8个字节的内存空间。 2.1.5: char类型 char类型数据占据2个字节的内存空间。 2.1.6: float类型 float类型数据占据4个字节的内存空间。 2.1.7: double类型 double类型数据占据8个字节的内存空间。 2.1.8: boolean类型 boolean类型数据只有true、false两个值,默认初值为false。 明显,布尔值是确定判断的真假。当然,真假的表示不仅仅是true与false,还能用数字,也就是说:非正数表false,正数表true。 2.2:引用数据类型 引用,就是一个指向了类的实例化对象的变量,那么该变量就属于引用数据类型。 3. 数据类型的转换 数据类型的有着严格的限制,实现类型转换须经过严格的步骤和规定。 转换方式有着两种。 3.1. 自动类型转换 自动转换即是向上类型转换。 自动转换的两个前提条件: 转换前的数据类型与转换后的类型兼容; 转换后的数据类型的表示范围比转换前的类型大(向上)。 3.2. 强制类型转换 强制转换须以“(转换后的类型)oldData”格式进行。如果强制向下转换,转换后的数据可能相比转换前,会丢失精度。 结束 2019年8月6日 15:49:58

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册