JAVA 新提案:努力简化 Hello World 写法


OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。这个提案主要是引入“灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。

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

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

Ron 认为,作为新手入门的第一个程序,这段代码太复杂了。比如 class 声明和强制性的 public 访问修饰符是大型编程结构,它们在封装具有定义良好的外部组件接口的代码单元时很有用,但在这个入门小示例中毫无意义。String[] args 参数用于将代码与外部组件连接起来,但在这段代码里面不会被使用。static 修饰符是 Java 类和对象模型的一部分,但在新手村出现也为时尚早。

作为优化,该提案首先增强了启动 Java 程序的协议灵活性:

  • 允许已启动类的 main 方法具有 public 、 protected 或默认(即包)访问权限。
  • 如果启动的类不包含带 String[] 参数的 static main 方法,但包含不带参数的 static main 方法,则调用该方法。
  • 如果启动的类没有 static main 方法,但有一个非 private 零参数构造函数(即 public 、 protected 或包访问)和一个非 private 实例 main 方法,然后构造该类的一个实例。如果该类有一个带 String[] 参数的实例 main 方法,则调用该方法;否则,不带参数调用实例 main 方法。

如此一来便允许省略 main 方法的 String[] 参数,并允许 main 方法既不是 public 也不是 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 提案中逐步解决。

该优化属于预览语言功能,默认禁用。要在 JDK 21 中尝试该示例,必须启用预览功能: javac --release 21 --enable-preview Main.java 编译程序,用 java --enable-preview Main 运行;或者使用源代码启动器时,使用 java --source 21 --enable-preview Main.java 运行程序。

有关灵活的启动协议和匿名 main 类的更多信息,可以在提案正文中详阅。

提案目标

  • 为 Java 提供平滑的入口,方便教育工作者可以循序渐进地介绍编程的概念。

  • 帮助学生以简洁的方式编写基本入门程序,并随着其 Java 技能增长,优雅地扩展代码。

  • 减少编写简单程序(例如脚本和命令行实用程序)的仪式。

  • 不要单独介绍 Java 的初学者方言。

  • 不引入单独的初学者工具链;编译和运行学生的程序,使用的工具应该和生产环境的 Java 程序相同。


相關推薦

2023-06-10

sp;JEP 445 ...(关于 JEP 445 的详情可查看该文章:JAVA 新提案:努力简化 Hello World 写法) JDK 21 的初始候选版本将于 8 月发布,第二个候选版本将于 8 月下旬发布,目前 JDK 21 的 GA 目标是 9 月 19 日。等 JDK 21 正式 GA 我们再详细

2023-11-04

) = "world" 据介绍,WasmGC 是 WebAssembly 社区群组发布的一项提案。当前的 Wasm 最小可行化实现只能处理线性内存中的 number 类型数据,即整数和浮点数。随着引用类型 (reference types) 提案的发布,Wasm 还可以保留外部引用。 WasmGC 现

2023-10-21

性能改进。此外,Ruvy不需要在运行时提供WASI参数,从而简化了Wasm模块的执行。 WASI是一组导入的Wasm函数的标准化集合,旨在为Wasm模块提供一个标准接口,以实现许多典型语言标准库中存在的系统调用。 目前,Ruvy并未随

2024-08-01

减少30%-50%的编程工作量。 统一编程规范: 降低出错率,简化维护流程。 高性能: 支持高效序列化,速度提升近10倍,数据体积减小至20%。 多数据源整合: 支持数据读写分离及灵活的数据源管理。 高效安全的缓存机制: 查询

2023-05-06

效仿。Go 开发团队技术 leader Russ Cox (rsc) 今天提出了一项提案:添加新的文件扩展名.ʕ◔ϖ◔ʔ作为.go的替代方案。 rsc 在提案中写道,Go 在 Unicode 竞赛中已经落后了,因此决不能让这种情况持续下去。他建议大家将谨慎抛诸脑

2022-05-21

void main() { auto app = new Archttp; app.get("/", (req, res) { res.send("Hello, World!"); }); app.listen(8080); } Golang 的 Gin 框架: package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/", func(context *gin.Context) { context.String(

2022-10-18

框架。可用来快速开发 Java 应用项目。主框架仅 0.1 MB。Helloworld: @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args); } @Get @WebSocket @Mapping("/hello") public String hello(@Param(defaultValue = "world") String name) { retur

2024-06-02

/artifactId> <version>4.1.6</version> </dependency> Hello World: @RequestMapping("/") public class HelloWorld extends JbootController { public void index(){ renderText("hello world"); } public static void main(String[] args){ JbootApplication.run(args); } }

2024-07-18

472:Prepare to Restrict the Use of JNI(准备限制 JNI 使用)”的提案,旨在保留 Java Native Interface (JNI) 作为与本地代码互操作的标准方式的状态。 JNI 在 JDK 1.1(可追溯到 1997 年 2 月)中被引入,作为 Java 代码与本地代码(通常用 C 语

2023-05-04

pp->{ //手写模式 app.get("/", ctx -> ctx.outputAsJson("{message:'Hello world!'}")) }); } //注解模式 @Get @Socket @Mapping("/hello") public String hello(String name) { return String.format("Hello %s!", name); } } 入门探索视频(用户录制):   本次更新:

2023-03-11

与 Java 进行了比较,以证明其简单美观性: Python print("Hello world.") Java public class HelloWorld { public static void main (String[]args) { System.out.println.("Hello world"); } } Scarlett 指出,作为一种通用语言,Python 可以用于各种应用程序,“简

2023-01-25

pp->{ //手写模式 app.get("/", ctx -> ctx.outputAsJson("{message:'Hello world!'}")) }); } //注解模式 @Get @Socket @Mapping("/hello") public String hello(@Param(defaultValue = "java") String name) { return String.format("Hello %s!", name); } } 入门探索视频(用户录制):

2023-08-31

uginBase提供的标准&统一的接口和自动注册机制, 极大的简化了插件的开发 不需要 插件开发者 了解C++/imgui等知识, 只需具备程序的编译能力即可轻松开发一个自己的 按键可视化插件 基本流程 1.在kplugin/auto-register目录创

2023-09-20

args) { Solon.start(App.class, args, app -> { //手写模式 app.get("/hello1", ctx -> ctx.output("Hello world!")); }); } //注解模式 @Get @Socket @Mapping("/hello2") public String hello2(String name) { return String.format("Hello %s!", name); } } 5、什么样的 Java 项目用 Solon