Java 工程的预处理

从语言源代码,到构建出最终的可执行体,在其间的一长串链式操作环节中,语言有没有提供预处理的能力,有时候对工程化还是有比较大的影响的。

像 Java 这样的语言,诞生之时就携带着极大的野心,要为语言使用者摒绝一切差异,使得代码可以一次编写,处处运行,但显然在实际的使用场景下,已经遭受到了越来越大的挑战。无论是自己在早期有所意识后区分出来的 J2ME、J2SE 以及 J2EE 这样的不同环境,还是眼下标准的 Java 与 Android 平台的差异,都是明证。

前段时间写几个工具类的时候,遇到了这样的困境,而且就是发生在 Android 之中。在其 android support 库向 androidx 库迁移的过程中,你会发现有大量的同名类的 import 需要且仅仅需要换一个 package name。更换之后,也只是一种单向切换,并不能新老兼顾。于是尝试寻找有无现成的脚手架之类的可供使用。

在 Github 上找到几个,筛选后记录两个于此:
– https://github.com/raydac/java-comment-preprocessor
– https://github.com/dannyjiajia/gradle-java-preprocessor-plugin

第一个还活跃着,而且看上去功能较强;后一个止于两年前,如其名字,应该只是一个 gradle 的插件。后者的形态,也是我构思的如果找不到现成可用品的话,自己可以实现的最近的可能目标的形态。

在考察各个实现的过程中,发现相当大的比例都是使用在“//”注释符之后再写“#”预处理语句,这跟我的预期还是略有偏差的。既然文本文件处理可以逐行进行,而且预处理又是发生在编译之前,为什么不直接使用“#”开始呢?而且好多在预处理之后的源代码里保留了这些预处理/注释的痕迹。不能理解,只好姑且认为是一种惯例,或者 Java 文化,甚至是实现方式上可能存在什么约束或者局限。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注