首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 的 main 方法声明终于要变天了吗? —— 浅谈 JEP 445

Java 的 main 方法声明终于要变天了吗? —— 浅谈 JEP 445

作者头像
HikariLan贺兰星辰
发布于 2023-10-18 07:35:18
发布于 2023-10-18 07:35:18
38800
代码可运行
举报
文章被收录于专栏:HikariLan's BlogHikariLan's Blog
运行总次数:0
代码可运行

本文最后更新于 128 天前,其中的信息可能已经有所发展或是发生改变。

ChatGPT 生成的文章摘要

这篇文章主要介绍了Java JEP 445,即预览中的JEP,引入了两个机制:未命名类和实例main方法,用于简化Java的main方法声明。通过这两个机制,可以使main方法更加灵活,仅需最基本的语法,方便入门学习Java。同时,在该预览版本中,如果Java代码中包含未命名类,javadoc实用工具将无法生成API文档。这两个机制并没有引入新的语法或语法糖,仅仅是提供了更方便的main方法'模板',但这仍然是Java编程中的重大改变。

Java 的 main 方法声明终于要变天了吗? —— 浅谈 JEP 445

前言

半天前,reddit 上一篇名为 “Oracle trying to troll us.”的帖子突然爆火,随后这张图片被传入中文互联网,同样引发了网友热烈的讨论。这篇帖子的文章内容只有这样一张图片:

如果你是一位苦逼的 Java 程序员,那么当你看到这张图的时候也许震惊的会跳起来,但是如果你没有看懂,那就且听我细细往下说……

JEP 445 的前世今生

JEP 445: Unnamed Classes and Instance Main Methods (Preview) 的标题翻译过来是 “未命名类和实例 main 方法”,仅看标题你可能并不认为和上面那些东西有什么关系,但事实上,上述特性确实是由此 JEP 带来的。

事实上,JEP 445 早在 2023 年 2 月就被创建了,单之所以刚刚才火,是因为 OpenJDK 14 个小时前才批准了这个 JEP 的代码实现:JDK-8306112 Implementation of JEP 445: Unnamed Classes and Instance Main Methods (Preview) by JimLaskey · Pull Request #13689 · openjdk/jdk (github.com)

值得一提的是,JEP 445 是一个即将在 Java 21 中引入的预览(preview)提案,这意味着你需要通过在编译和运行时传入 --release 21--enable-preview 命令行参数才能体验到这个功能

这种简化写法并不是 Java 的特例,其实早在 .NET 6,C# 就引入了一套 “控制台模板” 语法,其允许你在 C# 的主类文件(这里是 Program.cs)这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

其等价于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

很神奇对不对,但实际上说简单点这只是套语法糖而已。那么,JEP 445 也是如此吗?答案是否定的,甚至,它连语法糖都没有引入

真的是变天了吗?

如果你仔细查看 JEP 提案的原文,你会发现他们在 Summary 和 Goal 上提到最多的两个词是:studentsbeginners:

而仔细读读这部分内容你会知道,这个 JEP 设立的初衷是为了为学生和 Java 新手隐去晦涩难懂的部分,仅保留一些简单的语法,方便他们快速入门和学习 Java,但并不是引入了一套额外的 Java 方言

从始至终,这套东西就不是给普通 Java 开发者使用的,而是面向学生和新手入门使用的。

那么,JEP 445 到底引入了一套什么样的机制呢?

未命名类和实例 main 方法

JEP 445 引入了如下两个机制:Unnamed ClassesInstance Main Methods,通过如下两个机制,简化了 main 方法的声明。让我们先从后者开始讲起。

实例 main 方法

首先,我们来看如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HelloWorld { 
    public static void main(String[] args) { 
        System.out.println("Hello, World!");
    }
}

一个非常经典的“Hello World”代码,一个 HelloWorld.java 文件中包含了一个 HelloWorld 类,其中包含一个公开的静态 main 方法,并包含 args 形参;方法体内调用 System.out.println 方法打印 Hello, World! 到标准输出中。

这无疑非常复杂,以至于我用自然语言描述这段代码都用了三行字。而最烦人的是,这是 main 方法唯一的写法,你没有任何办法简化这套代码,哪怕像 C 语言那样隐去 args 形参都不行。

为了解决这个问题,JEP 445 引入了一套“灵活的启动协议(flexible launch protocol)”。首先,这允许“实例 main 方法”存在,所谓“实例 main 方法”,就是指“非静态的 main 方法”,这意味着,main 方法将可以是 non-static 的;接着一个 main 方法的访问修饰符将不必是 public 的,只需要是 non-private(也即public, protectedpackage-protected)的即可;最后,main 方法中的 String[] args 将是可选传入的。这意味着,你现在可以将代码简化到如下程度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HelloWorld { 
    void main() { 
        System.out.println("Hello, World!");
    }
}

因此,上述代码从来就不是什么新的语法糖,而是我们所熟知的东西:一个 HelloWorld.java 文件中包含了一个 HelloWorld 类,其中包含一个包访问级别非静态 main 方法,不包含形参;方法体内调用 System.out.println 方法打印 Hello, World! 到标准输出中。

非常有意思对不对,而如果存在多个 main 方法,将会以如下的优先级,选择优先级最高的一个 main 调用:

  1. 一个在启用类中声明,采用 non-private 访问级别的 static void main(String[] args) 方法;
  2. 一个在启动类中声明,采用 non-private 访问级别的 static void main() 方法;
  3. 一个在启动类中声明,或从其超类中继承的,采用 non-private 访问级别的 void main(String[] args) 方法;
  4. 一个在启动类中声明,或从其超类中继承的,采用 non-private 访问级别的 void main() 函数。

这其实改变了 Java 原有的行为:如果一个启动类声明了一个非静态的 main 方法,同时其超类存在一个“传统的”public static void main(String[] args) 方法,那么现在 Java 将会调用前者,而不是后者(当然,如果你真的这么做了,JVM 会在运行时输出一个警告来提示你)。

最后,如果一个即将被调用的 main 方法是一个内部类的成员,那么程序将无法运行。

所以,JEP 445 事实上是通过一系列语法层面的让步引入了一套更加方便使用的 main 方法模板,而并不是引入了一套新的语法或是语法糖。

未命名类

也许你早已知道,当一个 Java 类文件位于源代码文件的顶级,也就是说其不属于任何包中时,那我们就说这个类属于一个“未命名包”。在 JEP 445 中,引入了“未命名类”的概念,当一个类源代码中不包含任何类声明,而仅有方法声明和成员变量声明时,该类便被称为“未命名类”。

未命名类永远是未命名包的成员,而且其永远是 final 的,也就是说其不能实现或拓展任何接口和类;未命名类无法使用静态方法的方法引用,但是仍然可以使用 this 关键字或非静态方法的方法引用。

未命名类不能被其他类按名称引用,也无法构造其实例;其内部写法与显式声明的类完全相同,除了其只能有一个默认的无参构造方法。

通过引入未命名类,上述代码最终可以被简化成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main() {
    System.out.println("Hello, World!");
}

一个未命名类,其中包含一个包访问级别非静态 main 方法,不包含形参;方法体内调用 System.out.println 方法打印 Hello, World! 到标准输出中。

除此之外,一个未命名类依然可以拥有成员变量和成员方法,例如这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String greetingMsg = "Hello, World!";

String greeting() { return greetingMsg; }

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

当 JVM 试图执行一个在一个未命名类中的非静态 main 方法时,实际上等同于创建了一个匿名类,然后再执行方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Object() {
    // the unnamed class's body
}.main();

我们可以通过 java 指令来直接运行一个未命名类源代码,像是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ java HelloWorld.java

然后,Java 编译器会将其编译为 HelloWorld.class,找到 main 方法并执行。即使这里我们给未命名类分配了一个名字,但是这个名字实际上是不能用在 Java 源代码中的。

最后,在当前预览版本中,如果我们的 Java 代码中含有未命名类,那么 javadoc 实用工具将无法生成 API 文档,因为其本身就无法被其他类访问。

后记

看完整个 JEP,我只想感叹 OpenJDK 开发者的脑洞确实是大,竟然通过引入两套新的机制,巧妙地解决了 Java main 方法冗长的问题,而并未引入新的语法或语法糖,以造成用户体验割裂。

这篇 Reddit 文章下的高赞评论给出了 JEP 445 的链接,随后提问到:“这将是 Java 模板代码梗的末日吗”,我想,至少在 JEP 445 中,这种痛苦还远未结束吧。(完)

引用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-6-04 2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
实时音视频 TRTC 常见问题汇总---WebRTC篇
TRTC Web SDK 对浏览器的详细支持度,您可以查看 TRTC Web SDK 对浏览器支持情况。
腾讯视频云-Zachary
2019/11/15
23.4K3
实时音视频 TRTC 常见问题汇总---WebRTC篇
音视频之音频相关概念介绍
在从事音视频的音频开发中,难免会遇到一些问题,比如声音异常,回音等问题,这时候有比较牢固的概念基础会对分析这些问题很有帮助。本篇就介绍下音频相关的概念
一只小虾米
2022/10/25
1.4K0
音视频之音频相关概念介绍
TRTC上下行无声怎么处理
打开监控仪表盘,输入 sdkappid 和 roomid,并切换到问题用户的通话详情页面,之后再切换到音频详情页卡。如果音频发送码率不正常(持续小于16kbps),则为上行无声;如果音频接受码率不正常(持续小于16kbps),则为下行无声。
TRTC小百科
2021/10/11
2.8K0
腾讯会议如何保证语音质量?音频信号处理中有这些秘籍!
导读 | 腾讯会议在去年年底推出,集结腾讯在AI、云计算、安全等方面的能力,全方位满足不同场景下的会议需求,在短短两个月内就突破千万日活大关。面对多样且复杂的场景,比如开会环境嘈杂、同一地点多设备接入、房间声学参数不理想等,腾讯会议如何通过对音频信号的处理持续保障高品质通话,提升沟通效率?本文是腾讯多媒体实验室音频技术专家李岳鹏在「腾讯技术开放日·云视频会议专场」的分享整理。 点击视频,查看直播回放 一、TRAE技术降噪增益揭秘 先简单讲一下VOIP中语音数据实时传输路径图,我们可以看到远端的数据通过
腾讯多媒体实验室
2020/04/01
7.8K1
音视频技术基础(六)-- 3A处理
前面我们有学到,音视频数据的处理过程有个预处理过程,也就是在音视频数据采集完成之后的一步,音频的预处理就是用的3A处理,3A即AEC、ANS、AGC。当音频同时存在上下行,AEC必不可少。
黑眼圈云豆
2020/07/12
10K1
微信小程序使用TRTC
在使用之前我们需要了解 <live-player> 和 <live-pusher> 微信小程序原生组件,因为小程序TRTC组件标签 <trtc-room> 是基于这两个标签实现的组件,所以在运行调试时开发工具是不支持的,只能在真机上运行。
yuliang
2021/03/10
3K0
音视频知识图谱 2022.06
前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看这个合集:音视频面试题集锦。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱,你可以看看这个合集:音视频知识图谱。
关键帧
2022/11/29
6820
音视频知识图谱 2022.06
云视频会议背后的语音核心技术揭秘:如何进行语音质量评估?
导读 | 自疫情发生以来,腾讯会议每天都在进行资源扩容,日均扩容主机接近1.5万台,用户活跃度攀升。在如此高并发流量的冲击下,腾讯会议如何保证语音通信清晰流畅?如何对语音质量进行评估?在【腾讯技术开放日·云视频会议专场】中,腾讯多媒体实验室音频技术专家易高雄针对语音质量评估进行了分享。 点击视频,查看直播回放 一、语音质量界定     音频和语音是电声学下面两个不同的学科分支,属于两个不同的应用,两者在应用目的、使用场景、行业和用户认知统一度三方面存在差异,所以对于语音质量测试来说,首先要界定一下评估对象
腾讯多媒体实验室
2020/04/13
3K0
实时音视频助力在线教育风口
各位朋友大家好,今天主要是来分享关于实时音视频与教育的结合。本来最开始的标题是“TRTC与在线教育的那些事儿”,但考虑大家都是做技术的,所以改为“实时视频助力在线教育的新风口”,能力有限,如果有错误与问题,还请多多指教,欢迎一起交流学习。
LiveVideoStack
2020/11/12
1.5K0
实时音视频助力在线教育风口
你问我答 | 实时音视频TRTC(2021年5月-7月)
实时音视频TRTC 你问我答 第1季 本期共解答10个问题 Q1:移动端(Andriod/iOS)支持哪几种系统音量模式? 支持2种系统音量类型,即通话音量类型和媒体音量类型: 通话音量,手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质相比媒体音量类型较差, 无法通过音量按键将音量调成零,但是支持蓝牙耳机上的麦克风。 媒体音量,手机专门为音乐场景设计的音量类型,音质相比于通话音量类型要好,通过通过音量按键可以将音量调成零。使用媒体音量类型时,如果要开启回声抵消(AEC
腾讯云音视频
2021/08/30
1.4K0
直播新玩法背后的音视频技术演进
近年来,直播改变了许多行业模式,其形态在不断的演进中也逐渐丰富起来。直播在字节跳动中衍生出了KTV歌房、直播答题、互动游戏、电商拍卖及企业直播等不同场景。本次分享我们邀请到火山引擎视频云音视频直播客户端研发负责人——徐鸿,向大家介绍直播场景中沉淀下的优秀架构能力和技术能力。
LiveVideoStack
2021/12/27
1.5K0
直播新玩法背后的音视频技术演进
音视频基础能力之 Android 音频篇 (四):音频路由
涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能。本系列文章将详细讲述移动端音视频的采集、渲染、硬件编码、硬件解码这些涉及硬件的能力该如何实现。
声知视界
2024/12/23
8050
音视频基础能力之 Android 音频篇 (四):音频路由
创新架构扫清难题,TRTC实时合唱解决方案让你在家Get千人大合唱的快乐!
同时,全民K歌还持续打造明星大合唱玩法,与吴克群、张远、陈卓璇等超多实力歌手合作,邀请他们空降歌房和K歌粉丝实时互动。有实力的粉丝可以参与选拔,赢取与明星1v1对唱的机会。普通歌迷朋友也可以加入”明星空降大合唱“,歌手作为领唱,歌迷点击”加入合唱“,便可与明星同框合唱,无需抢票去现场,在家就能分分钟Get演唱会全场合唱的快乐,获得堪比演唱会现场的沉浸式体验。
腾讯云音视频
2024/04/30
5010
创新架构扫清难题,TRTC实时合唱解决方案让你在家Get千人大合唱的快乐!
解决方案 | “金三银四”盛装出席,TRTC视频面试方案助你抢到心动offer!
去年的招聘季,“金三银四”双双缺席,疫情之下的求职,非常艰难,存在着打工人返乡之后获取不到招聘信息、应届毕业生对行业了解较少、企业雇主无法深入面试筛选合适的人才等问题。在疫情这个大环境的影响下,线上视频招聘面试犹如“雪中送炭”一样。虽然国内疫情基本已经过去,但是越来越多的企业HR和求职者更热衷于视频面试这种跨越时空的方式。 我们常见的线上招聘场景有两种: 1、线下面试线上化 从具体操作看,招聘者与候选人达成面试意向后,可预约面试时间或直接发起视频面试邀请,候选人接受视频面试并如期进入线上面试房间,双
腾讯云音视频
2021/04/15
5830
iOS 音视频接入 - 初识TRTC
在上一篇文章中我们对音视频有了最基础的认识,下面就来了解下第三方提供的功能强大的实时音视频SDK-TRTC。
小明同学接音视频
2020/10/09
3.1K0
iOS 音视频接入 - 初识TRTC
如何做好游戏内实时语音体验
本文即针对移动游戏环境下实时语音所面对的挑战,介绍一些语音预处理、流媒体协议等通用的解决方案。
腾讯游戏云
2018/02/28
13.7K4
如何做好游戏内实时语音体验
微信小程序TRTC使用custom自定义面板(实现篇)
本文主要是使用 custom 面板实现直播互动,上下麦操作。如有疑问可参考 微信小程序TRTC使用custom自定义面板(理解篇)。本文只是简单演示如何实现主播与观众进行连麦互动,在实际中,通常是有主播端发起与粉丝进行直播互动,通过粉丝来接受,进行连麦。发送这种消息可以使用IM(即时通讯)完成。
yuliang
2021/03/16
1.4K0
实时音视频 TRTC 常见问题汇总---咨询问题篇
TRTC 是腾讯云基于 QQ 十多年来在音视频通话技术上积累,结合腾讯浏览服务 TBS WebRTC 能力与腾讯实时音视频 SDK ,为客户提供多平台互通高品质可定制化的 实时音视频互通服务 解决方案。 (1)您可以通过“crtl+F”(win)、“command+F”(mac)搜索关键字。 (2)若没有您想要的问答,欢迎在评论区提问、留言和交流,笔者会定期解答疑惑。 (3)最新产品动态与变更以官网文档为准。
TRTC小百科
2021/09/16
9.2K2
IEEE ASRU 2023录用论文解读 | 打造极致听觉体验,腾讯云MPS音频处理能力及降噪算法原理
近期,语音与语言处理领域旗舰会议IEEE ASRU 2023论文入选结果公布。腾讯云媒体处理(MPS)在语音增强降噪方向的创新成果再获业界认可,《Magnitude-and-phase-aware Speech Enhancement with Parallel Sequence Modeling》(简称MPCRN)和《VSANet: Real-time Speech Enhancement Based on Voice Activity Detection and Causal Spatial Attention》(简称VSANet)两篇论文被IEEE ASRU 2023录用。本文将结合论文内容,与大家分享腾讯云媒体处理(MPS)在音频处理方面的最新能力、相关技术方案以及算法原理。
腾讯云音视频
2023/11/05
7970
IEEE ASRU 2023录用论文解读 | 打造极致听觉体验,腾讯云MPS音频处理能力及降噪算法原理
实时音视频 TRTC 常见问题汇总---集成接入篇
TRTC 的日志默认压缩加密,后缀为 .xlog。日志是否加密是可以通过 setLogCompressEnabled 来控制,生成的文件名里面含 C(compressed) 的就是加密压缩的,含 R(raw) 的就是明文的。
腾讯视频云-Zachary
2019/11/01
14.7K1
实时音视频 TRTC 常见问题汇总---集成接入篇
推荐阅读
相关推荐
实时音视频 TRTC 常见问题汇总---WebRTC篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验