今天Java 18将正式公布, 尽管它不是长期反对 (LTS) 版本,但它却实现了九个 JEP(在Java 18列出)。有哪些个性值得关注呢?明天胖哥为你提前解读。再看、点赞、转发、关注来一波吧。

JEP 400

将 UTF-8 指定为规范 Java API 的默认字符集。通过此更改,依赖于默认字符集的 API 将在所有实现、操作系统、语言环境和配置中保持一致。

JEP 408

Java外部终于有原生的Web服务器了。然而请留神它没有可用的 CGI 或相似 Servlet 的性能。该工具可用于原型设计、长期编码和测试目标,尤其是在教育环境中。

它并不是JettyApache Tomcat等产品的竞品,也无奈而且不举荐在生产环境中应用。仅仅是提供一个命令行工具来辅助帮忙开发人员设计、测试、教学。

JEP 413

反对在Java API文档中应用代码片段。以前在Java代码的正文中如果要写一些样例十分麻烦,甚至还要进行字符本义。当初Java正文引入了一个新的标记 @snippet 来解决正文中蕴含代码片段样例的问题。

它能够内联应用:

/** * The following code shows how to use {@code Optional.isPresent}: * {@snippet : * if (v.isPresent()) { *     System.out.println("v: " + v.get()); * } * } */

也能够援用内部片段:

/** * The following code shows how to use {@code Optional.isPresent}: * {@snippet file="ShowOptional.java" region="example"} */

ShowOptional.java就是它援用的源代码:

public class ShowOptional {    void show(Optional<String> v) {        // @start region="example"        if (v.isPresent()) {            System.out.println("v: " + v.get());        }        // @end    }}

JEP 417

引入一个 API 来表白向量计算,该计算能够在运行时牢靠地编译为反对的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。 目前是第三次孵化。

JEP 418

为主机名和地址解析定义服务提供者接口 (SPI),以便java.net.InetAddress能够应用平台内置解析器以外的解析器。 这个对于互联网一些协定的接入提供了入口,同时你也能够对现有计划进行一些改良和定制。

JEP 419

Foreign Function & Memory API ( JEP 419 ) 是此版本中实现的更重要的 JEP 之一,因为它是Project Panama中蕴含的孵化组件之一。 Panama 正在简化将 Java 程序连贯到非 Java 组件的过程。这一非凡性能在其第二次孵化迭代中引入了一个 APIJava 程序通过该 API 调用Native类库并解决Native数据。目标是取代设计的十分不现实的Java Native Interface (JNI)

大家都晓得其它语言有十分棒的一些类库,然而Java想调用其它语言的类库目前须要应用JNI。然而JNI被设计得太简单了,让很多Java开发者难以上手。如果这一情况失去扭转,那么利用Java去调用一些C或者C++音视频解决库和Python的机器学习库将是非常容易的事件。

JEP 420

实现的惟一真正影响 Java 语言的 JEP 是Pattern Matching for switch ( JEP 420 ),它在 Java 17 中首次预览(这是第二次预览)。其目标是“通过对switch 表达式和语句的模式匹配以及对模式语言的扩大来加强 Java 编程语言 。在 Java 16 中,JEP 394扩大了instanceof运算符以采纳类型模式并执行模式匹配

// Old codeif (o instanceof String) {    String s = (String)o;    ... use s ...}// New codeif (o instanceof String s) {    ... use s ...}

咱们应用instanceof后无需再对对象进行类型转换就能够应用其实在的类型。

Java 14又引入了switch表达式:

int numLetters = switch (day) {    case MONDAY, FRIDAY, SUNDAY -> 6;    case TUESDAY                -> 7;    case THURSDAY, SATURDAY     -> 8;    case WEDNESDAY              -> 9;    default                     -> 11;    };

如果这两个能联合起来,switch能进行模式匹配的话,上面的句子将大大简化:

static String formatter(Object o) {    String formatted = "unknown";    if (o instanceof Integer i) {        formatted = String.format("int %d", i);    } else if (o instanceof Long l) {        formatted = String.format("long %d", l);    } else if (o instanceof Double d) {        formatted = String.format("double %f", d);    } else if (o instanceof String s) {        formatted = String.format("String %s", s);    }    return formatted;}

JEP 420的预览个性,将会把下面简短的代码简化为:

static String formatterPatternSwitch(Object o) {    return switch (o) {        case Integer i -> String.format("int %d", i);        case Long l    -> String.format("long %d", l);        case Double d  -> String.format("double %f", d);        case String s  -> String.format("String %s", s);        default        -> o.toString();    };}

是不是更加清晰了呢?

JEP 421

Object对象有一个 finalize 办法,该办法用于实例被垃圾回收器回收的时触发的操作。当 GC (垃圾回收器) 确定不存在对该对象的有更多援用时,对象的垃圾回收器就会调用这个办法。过后它的设计用来防止内存泄露,当初曾经有了更好的代替计划try-with-resourcesJava 9引入的 java.lang.ref.Cleaner

因而,所有该办法会被标记为过期,将来将被移除。

总结

很少有人在生产中应用 JDK 18,因为它不是 LTS 版本。去年九月公布JDK 17 LTS 版本更为重要,很多类库,特地是Spring framework 6.0Spring Boot 3.0 都将基于JDK17,你还要在Java 8保持多久呢?曾经相差了10个版本了。下一个是LTS是 2023 年 9 月的 Java 21

关注公众号:Felordcn 获取更多资讯

集体博客:https://felord.cn