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' - 它需要分析现有的源文件并完整地保留任何生成的常量,因为存在一些不属于此增量 运行 的输入源文件。即使您知道自己在做什么,这至少也是一个多天的项目。