相信,很多人都不知道 Java 的 Method 的上限为64K。本文将超过这个上限的函数叫做巨型函数。
1、如果代码超过了这个限制,Java 编译器就报"Code too large to complier"的错误。
2、代码并没有超过 64K 的限制,但是在运行时由于其他工具或者 library 使得对应的代码超过了 64K 的限制,那么 Java 会给我们一个 java.lang.VerifyError 的错误。
如下一些仅仅是一些可能导致出现巨型函数的常见情况,还有很多其他情况就不一一列举了。
很多大函数并不是人手动写出来的,是一些代码生成工具生成的,例如 ANTLR(ANother Tool for language Recognition)就有可能生成巨大的 Method。
Initialization 方法就很容易变成巨型函数,尤其是一些 GUI 的初始化函数,很容易在一个代码段中塞进去很多对应的 GUI 的布局定义代码和 attaching listener 代码,导致巨型函数的产生。
测者在工作中也遇见过 static final 数组编译器使用 load 或者 sotre 的指令初始化数组。这有时候也会导致出现巨型函数。
很多 JSP 的编译器也会将所有的 JSP 代码编译到一个函数中,导致巨型函数的出现。
最好也是最根本的解决巨型函数的方法就是拆分。无论是代码生成工具还是 JSP 都允许我们进行代码的拆分。但是其他一些例如调用第三方工具或者 library 导致的这个问题,很多时候就不能通过粗暴的代码拆分解决问题了,需要重新设计,优化算法等方式避免巨型函数的出现。也有很多时候我们没有办法避免巨型函数的 64K 限制,我们最终的根本方法还是寄希望于 Java 自身接触 64K 的限制。