java:在很长的包中处理许多相同的命名类

oipij1gg  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(324)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

21天前关门了。
改进这个问题
以下问题:许多生成的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层)。我该怎么处理?代码很快就变得不可读了,因为与枚举值的比较会跨越多行。。。
有什么想法吗?

57hvy0tb

57hvy0tb1#

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类,您可能不希望这样。
因此,您必须确保这个类本身是生成的。
编写生成器是相当费劲的,而且会使构建工具稍微复杂一些。这里可以使用注解处理器(它们实际上是编译器的“钩子”,在编译期间运行)。一个大问题是编译运行是增量的,因此注解处理器不能只是“收集常量”和“生成源文件”——它需要分析现有的源文件,并保留由于存在一些不属于此增量运行的输入源文件而生成的任何常量。即使你知道你在做什么,这至少是一个多日的项目。

相关问题