JEP 477 通过隐式声明类和实例主方法增强初学者体验

2024-06-27 18:28:35 浏览数 (2)

作者 | A N M Bazlur Rahman

译者 | 平川

策划 | Tina

JEP 477(隐式声明类和实例主方法第三个预览版)已经从 Proposed to Target 状态提升到 Targeted 状态。该 JEP 建议“发展 Java 语言,让学生不需要理解为大型程序设计的语言特性就可以编写他们的第一个程序。”该 JEP 是对 Brian Goetz 在 2022 年 9 月发表的博文 Paving the on-ramp 的进一步深化。Gavin Bierman 是 Oracle 的一名技术顾问,他编写的 最新规范文档 草案已向 Java 社区开放以供审阅。

在构建大型复杂应用程序方面,Java 的能力早已得到认可。然而,其广泛的特性可能会让刚刚开始学习编程的初学者望而生畏。为了解决这个问题,JEP 引入了新的预览特性,为新晋程序员简化这门语言的使用。这些特性使得初学者不用理解为大型应用程序设计的复杂的语言结构就可以编写他们的第一个程序,并使有经验的开发人员可以更简便地编写小型程序,提高生产力和代码可读性。

我们来看下经典示例Hello, World! ,这通常是初学者的第一个程序:

代码语言:javascript复制
public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

根据这个 JEP,上述程序可以简化为下面这个样子:

代码语言:javascript复制
void main() {
    println("Hello, World!");
}

该提案引入了多项关键特性,为初学者简化了 Java 的开发,并保持其强大的功能不受影响。其中一个主要的亮点是引入了隐式声明类,即可以在没有显式类声明的情况下编写新程序。在这个新方法中,源文件中的所有方法和字段都被视为隐式声明类的一部分。隐式声明类继承自Object,不实现接口,并且不能在源代码中按名称引用。此外,该提案还引入了实例主方法,不再强制要求它们是staticpublic的,并且不带参数的方法也可以作为有效的程序入口点。

通过这些更改,开发人员现在可以像下面这样编写Hello, World!了:

代码语言:javascript复制
void main() {
    System.out.println("Hello, World!");
}

最上面的成员会被解释成隐式类的成员,因此,我们也可以像下面这样编写程序:

代码语言:javascript复制
String greeting() { 
    return "Hello, World!"; 
}

void main() {
    System.out.println(greeting());
}

或者像下面这样使用一个字段:

代码语言:javascript复制
String greeting = "Hello, World!";

void main() {
    System.out.println(greeting);
}

伴随 JDK 21(JEP 445)的初始预览和 JDK 22 (JEP 463)的后续更新,该提案已根据社区反馈做了进一步完善。例如,在这个 JEP 中,隐式声明类现在可以自动从新的java.io.IO类中导入以下三个静态方法,用于简单的文本 I/O:

代码语言:javascript复制
public static void println(Object obj);
public static void print(Object obj);
public static String readln(String prompt);

这样一改就不需要System.out.println这行代码了,因而可以简化控制台输出。请看下面的例子:

代码语言:javascript复制
void main() {
    String name = readln("Please enter your name: ");
    print("Pleased to meet you, ");
    println(name);
}

Java API 中声明的许多其他类在小型程序中也很有用,可以在源文件的开头显式地导入它们:

代码语言:javascript复制
import java.util.List;

void main() {
    var authors = List.of("James", "Bill", "Bazlur", "Mike", "Dan", "Gavin");
    for (var name : authors) {
        println(name   ": "   name.length());
    }
}

不过,有了 JEP 476(模块导入声明),隐式声明类可以自动从java.base模块导入所有 public 顶级类和接口,这样就不用再显式导入像java.util.List这样的常用的 API。这使得开发过程更加顺畅,并且可以减缓新晋程序员的学习曲线。要了解关于 JEP 476 的更多细节,可以阅读 InfoQ 的这篇新闻报道。

这是一项 预览语言特性,在 JDK 23 编译器和运行时中可通过--enable-preview启用。要在 JDK 23 中测试上述示例的话,可以通过以下方法启用该预览特性:

  • 使用javac --release 23 --enable-preview Main.java 编译程序,并使用java --enable-preview Main运行,或者
  • 如果是使用 源代码启动器,则使用java --enable-preview Main.java运行,或者
  • 如果是使用 jshell,则使用 jshell --enable-preview启动。

与引入单独的 Java 方言相比,该 JEP 简化了单类程序的声明过程,使学习曲线不那么陡峭,让初学者可以从简单、简洁的代码入手,并随着经验的积累逐步采用更高级的特性。通过简化语法和最小化样板代码,作为一种适用于各种应用程序的通用而强大的编程语言,Java 继续保持着它一贯的声誉。对于新晋程序员,该增强可以使他们更轻松地使用 Java,而对于从事小型项目开发的经验丰富的开发人员,该增强可以提高他们的效率以及代码的可读性。

原文链接:

https://www.infoq.com/news/2024/05/jep477-implicit-classes-main/

声明:本文由 InfoQ 翻译,未经许可禁止转载。

0 人点赞