首页 > 解决方案 > Java:处理非常长的包中的许多相同命名的类

问题描述

以下问题:很多生成的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 级)。我该如何处理?代码很快变得不可读,因为与枚举值进行比较会跨越多行......

有任何想法吗?

标签: javacoding-style

解决方案


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但这确实意味着您需要记住对其进行更新,并且鉴于已生成 `Message1 类,您可能不希望那样做。

因此,您必须确保此类本身是生成的。

编写生成器需要付出很大的努力,并且还会使您的构建工具稍微复杂化。注释处理器可以在这里使用(它们实际上是编译器的“挂钩”,它们在编译期间运行)。一个大问题是编译运行是增量的,因此注释处理器不能只是“收集常量”和“生成源文件”——它需要分析现有的源文件并保留由于某些存在而生成的任何常量不属于此增量运行的输入源文件。即使您知道自己在做什么,这至少也是一个多天的项目。


推荐阅读