乐趣区

关于java:Java-8-10-Java-18

今天 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 code
if (o instanceof String) {String s = (String)o;
    ... use s ...
}

// New code
if (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

退出移动版