JAVA:不同源文件夹下存在相同包和类名的冲突
Posted
技术标签:
【中文标题】JAVA:不同源文件夹下存在相同包和类名的冲突【英文标题】:JAVA: Conflicts with Same Package and class names present under different Source folders 【发布时间】:2018-08-14 00:49:43 【问题描述】:我正面临与在不同来源下具有相同名称的类和包名称的冲突。简而言之,目录结构有点像这样:
src/test/java
com.service.helper
Constants.java
src/intTest/java
com.service.helper
Constants.java
com.service.utility
SomethingTest.java
在两个 Constants.java 中定义的少数常量字符串是相同的,并且很少是这些类独有的。 现在我在 src/intTest/java 下有一个 SomethingTest.java 文件,它应该利用在 src/intTest/java 下定义的 Constants.java。
但是,它似乎使用的是 src/test/java 包下定义的 Constants.java 文件。因此,我无法使用 src/intTest/java 文件下的 Constants.java 中定义的常量字符串。
谁能说明为什么会这样?真的可以访问src/intTest/java下定义的Constants.java,而不改变当前文件名的包结构吗?
感谢您的帮助。谢谢。
【问题讨论】:
从java的角度来看:相同的包名+相同的类名=相同的类。我不知道您是否可以使用自己的自定义类加载器以某种方式解决您的问题,但我宁愿不走这条路,而是使用包+类名,因为它们打算被使用。 尝试使用静态导入,直接访问变量 com.service.helper.Constants.PI; 使用的导入已经是静态的。问题仍然存在。我只是想确保没有任何方法可以访问这些文件而不重命名它们。是的,我猜就是这样!非常感谢! 【参考方案1】:Java 类的身份 是它的“绝对”名称,如x.y.z.SomeClass
。当您有两个具有绝对 相同 包名和类名的类时,“java”无法区分它们。
换句话说:这是不好的做法。你真的想避免这种情况。解决方案不是解决“我的工具在抱怨”,而是以更符合“标准 Java 约定”的方式组织您的源代码。
换句话说:最好的办法是重命名一些包,或者确保具有唯一的类名。
【讨论】:
在我的项目中,类的命名约定确实出现了一些缺陷。按照建议,我更改了班级名称并且一切正常。【参考方案2】:你有两个选择:
-
将常量重命名为 IntConstants(唯一)
(推荐)将 intTest(我猜是集成测试)放到它的
自己的包。
推荐选择 2,因为集成测试不需要与测试类在同一个包中,因为它只测试应用程序的公共 API,不需要访问任何包范围的变量。 如果您的情况并非如此,请考虑重构您的代码以使其与良好实践保持一致,并且不要将内部状态暴露在外部。将集成测试放到不同的包中有助于保持这种做法。
【讨论】:
嘿!我终于重命名了这些课程。此外,就这一点而言, intTest 确实包含所有集成测试用例,并且引用了在 Constants.java 文件中定义的少量常量字符串。正在测试的实际类位于不同的源文件夹 - src/java/main。输入非常有帮助。赞一个! 是的,我可以看到它是标准的文件夹 maven 结构,但文件夹结构和包结构之间存在差异。我的意思是文件夹src/intTest/java
中的所有内容都可以像com.service.integration.helper
一样移动到它自己的包中,而不是重复使用com.service.helper
包。
哦,这样啊!?!是的,这是有道理的:)以上是关于JAVA:不同源文件夹下存在相同包和类名的冲突的主要内容,如果未能解决你的问题,请参考以下文章
廖雪峰Java2面向对象编程-5包和classpath-1包package