java新提案JEP445:简化hello world写法

500 阅读3分钟

首先可喜可贺的是前两天Java20发布了,带来了不少新特性。但最新的java提案JEP445:

「Flexible Main Methods and Anonymous Main Classes」(灵活的 Main 方法和匿名 Main 类),该项提案将会以预览版的形式出现在java21中,该提案已经在网上引起了大量讨论。

其目的在于:

  • 为 Java 提供平滑的入口,以便教育工作者可以循序渐进地介绍编程概念。
  • 帮助学生以简洁的方式编写基本程序,并随着他们技能的增长而优雅地扩展他们的代码。
  • 减少编写简单程序(例如脚本和命令行实用程序)的仪式。
  • 不要单独介绍 Java 的初学者方言。
  • 不要引入单独的初学者工具链;应该使用与编译和运行任何 Java 程序相同的工具来编译和运行学生程序。

提案者 Ron Pressler 这样解释到:当初学者接触java时,他们不需要了解封装,命名空间,访问控制等概念,这些概念都非常适合大型团队开发和维护大型复杂应用程序,在教学时往往会从变量、函数和子程序等基本的小型编程概念开始。

提案的作者 Ron Pressler 解释:现在的 Java 语言非常适合开发和维护大型复杂应用程序,但学校在教编程时往往会从变量、函数和子程序等基本的小型编程概念开始,在这个阶段,往往不需要类、包和模块的大型编程概念。

我们来看看现在 Hello, World! 入门程序 :

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

Ron Pressler认为这段代码有以下问题:太多的代码,太多的概念,太多的结构

  • 声明class和强制public访问修饰符是大型编程结构。它们在封装具有定义良好的外部组件接口的代码单元时很有用,但在这个小示例中毫无意义。
  • 该String[] args参数还用于连接代码与外部组件,它在这里是神秘且无用的,特别是因为它从未被使用过。
  • 修饰符static是 Java 类和对象模型的一部分。对于新手来说,static这不仅神秘而且有害:要添加更多main可以调用和使用的方法或字段,学生必须要么将它们全部声明为static从而传播一个既不常见又不是好习惯的习语——或者面对两者之间的区别静态成员和实例成员,并学习如何实例化对象。

可以稍微简化 Hello, World! :

class HelloWorld { 
    void main() { 
        System.out.println("Hello, World!");
    }
}

此外,还要引入匿名 Main 类来隐式声明 class :

void main() {  
    System.out.println("Hello, World!");
}

到这里 Java 的 Hello, World! 入门程序已经到了简化,但在 Ron 眼里,该 JEP 提供的优化只是使 Java 更易于学习的第一步,像 System.out.println 这种长方法 / 函数也是需要简化的地方,不过这些问题需要在未来的 JEP 提案中逐步解决。

个人认为这可能更多的是带来混淆而不是启发。快速启动是不错,但是他可能会为后面的java学习带来理解上的偏差。看着像是在标准java中有那么一点点不标准。

事实上与其他大多数脚本语言相比,这种写法也并不简单:

println( "Hello, World!" );

print("Hello, World!")

echo "Hello, World!";

但是如果这只是简化java代码的第一步,后续会有更多的简化代码的提案我会觉得这也不是一件坏事。

你的观点是什么呢?欢迎评论区讨论。