JAVA:与相同的包冲突和类名称存在于不同的源文件夹下

时间:2018-03-06 08:14:41

标签: java package packages directory-structure classname

我遇到与在不同来源下具有相同名称的类和包名称冲突。简而言之,目录结构看起来像这样:

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,而无需更改当前文件名的包结构?

感谢帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

Java类的标识是其“绝对”名称,如x.y.z.SomeClass中所示。如果您有两个具有绝对相同包和类名的类,则“java”无法区分它们。

换句话说:这是不好的做法。你真的想避免这种情况。解决方案不是解决“我的工具抱怨”,而是以更符合“标准java约定”的方式组织源代码。

换句话说:最好的办法是重命名一些包,或者确保拥有唯一的类名。

答案 1 :(得分:2)

您有2个选择:

  1. 将常量重命名为IntConstants(唯一)
  2. (推荐)把intTest(我猜它是集成测试)放到它上面 自己的包裹。
  3. 建议选择2,因为集成测试不需要与测试类位于同一个包中,因为它只测试应用程序的公共API,不需要访问任何包范围变量。 如果在您的情况下,请考虑重构您的代码以使其与良好实践保持一致,并且不要将内部状态暴露在外。将集成测试放到不同的包中有助于保持这种做法。