Java: 在非常长的包中处理大量相同名称的 类
Java: Dealing with a lot of identical named classes in very long packages
以下问题:很多 生成的 Java 类 看起来像这样:
com.company.project.lib.messages.version1.Message1;
com.company.project.lib.messages.version2.Message1;
com.company.project.lib.messages.version3.Message1;
com.company.project.lib.messages.version4.Message1;
com.company.project.lib.messages.version5.Message1;
...
每个 Message1 类 都有很多嵌套子类 或常量,例如
com.company.project.lib.messages.version1.Message1.VERSION.VERSION_A_WITH_CHANGE_1;
com.company.project.lib.messages.version1.Message1.VERSION.VERSION_B;
com.company.project.lib.messages.version1.Message1.Group1.SubGroupA.Format.MESSAGEFORMAT_1;
com.company.project.lib.messages.version1.Message1.Group1.SubGroupA.Format.MESSAGEFORMAT_2;
...
嵌套变得更深(最多 10 层)。
我该如何处理?代码很快就变得不可读了,因为与枚举值的比较跨越多行...
有什么想法吗?
Java 没有别名系统。因此,不存在简单的解决方案。
简单的解决方案:修复生成器
这是什么东西产生的?解决这个问题。使它不会在一百万个包中生成 'Message1',而是生成更有用的东西,例如 'Message1V1'、'Message1V2' 等。
硬解:生成代码
或者,如果您无法更改生成器代码或生成器使用的模板数据。您可以编写一个代码生成器来执行以下操作:
public final class Message1Constants {
public static final Whatever_VERSION_is V1_VERSION =
com.company.project.lib.messages.version1.Message1.VERSION;
}
这样你就可以写:
import static Message1Constants.*;
...
int x = V1_VERSION.VERSION_B;
当然,您可以手动编写此 M1Constants
class 但这确实意味着您需要记住更新它,并且考虑到已生成 `Message1 classes ,你可能不想要那个。
因此,您必须确保此 class 本身已生成。
编写生成器需要付出很多努力,并且还会使您的构建工具稍微复杂一些。注释处理器可以在这里使用(它们实际上是 'hook' 进入编译器,它们在编译期间 运行)。一个大问题是编译 运行s 是增量的,所以注释处理器不能只是 'gather constants' 和 'generate a source file' - 它需要分析现有的源文件并完整地保留任何生成的常量,因为存在一些不属于此增量 运行 的输入源文件。即使您知道自己在做什么,这至少也是一个多天的项目。
以下问题:很多 生成的 Java 类 看起来像这样:
com.company.project.lib.messages.version1.Message1;
com.company.project.lib.messages.version2.Message1;
com.company.project.lib.messages.version3.Message1;
com.company.project.lib.messages.version4.Message1;
com.company.project.lib.messages.version5.Message1;
...
每个 Message1 类 都有很多嵌套子类 或常量,例如
com.company.project.lib.messages.version1.Message1.VERSION.VERSION_A_WITH_CHANGE_1;
com.company.project.lib.messages.version1.Message1.VERSION.VERSION_B;
com.company.project.lib.messages.version1.Message1.Group1.SubGroupA.Format.MESSAGEFORMAT_1;
com.company.project.lib.messages.version1.Message1.Group1.SubGroupA.Format.MESSAGEFORMAT_2;
...
嵌套变得更深(最多 10 层)。 我该如何处理?代码很快就变得不可读了,因为与枚举值的比较跨越多行...
有什么想法吗?
Java 没有别名系统。因此,不存在简单的解决方案。
简单的解决方案:修复生成器
这是什么东西产生的?解决这个问题。使它不会在一百万个包中生成 'Message1',而是生成更有用的东西,例如 'Message1V1'、'Message1V2' 等。
硬解:生成代码
或者,如果您无法更改生成器代码或生成器使用的模板数据。您可以编写一个代码生成器来执行以下操作:
public final class Message1Constants {
public static final Whatever_VERSION_is V1_VERSION =
com.company.project.lib.messages.version1.Message1.VERSION;
}
这样你就可以写:
import static Message1Constants.*;
...
int x = V1_VERSION.VERSION_B;
当然,您可以手动编写此 M1Constants
class 但这确实意味着您需要记住更新它,并且考虑到已生成 `Message1 classes ,你可能不想要那个。
因此,您必须确保此 class 本身已生成。
编写生成器需要付出很多努力,并且还会使您的构建工具稍微复杂一些。注释处理器可以在这里使用(它们实际上是 'hook' 进入编译器,它们在编译期间 运行)。一个大问题是编译 运行s 是增量的,所以注释处理器不能只是 'gather constants' 和 'generate a source file' - 它需要分析现有的源文件并完整地保留任何生成的常量,因为存在一些不属于此增量 运行 的输入源文件。即使您知道自己在做什么,这至少也是一个多天的项目。