1. 引言

Java中的类命名遵循国际通用的驼峰命名法(Upper Camel Case),与大多数编程语言类似。然而,在处理同名类时,会面临挑战。自1998年早期的JDK发布以来,关于如何解决这种特殊情况的讨论一直存在。 这个问题的第一个官方报告是JDK-4194542,但至今JDK开发团队的建议仍是使用完全限定类名。然而,JDK短期内并没有添加此类功能的计划。

最近在2019年8月,Java开发者社区提出了一个新的解决方案(JEP),以应对这种情况,并得到了全球Java开发者越来越多的支持。在这篇教程中,我们将探讨处理同名类的策略和推荐。

2. 定义类

首先,我们在自定义包com.baeldung.date中创建一个名为Date的类。

package com.baeldung.date;

public class Date {

    private long currentTimeMillis;

    public Date() {
        this(System.currentTimeMillis());
    }

    public Date(long currentTimeMillis) {
        this.currentTimeMillis = currentTimeMillis;
    }

    public long getTime() {
        return currentTimeMillis;
    }
}

3. 完全限定类名

当这种用法被隔离且不常发生时,我们采用这种方法来避免冲突。 但是,通常情况下,使用完全限定类名被认为是较差的风格。让我们看看如何使用它,特别是如果包名简短且描述性强,可以使代码更具表达力,从而减少混淆并提高可读性。

另一方面,当内部对象涉及大型类或方法时,这有助于调试:

public class DateUnitTest {

    @Test
    public void whenUsingFullyQualifiedClassNames() {

        java.util.Date javaDate = new java.util.Date();
        com.baeldung.date.Date baeldungDate = new com.baeldung.date.Date(javaDate.getTime());

        Assert.assertEquals(javaDate.getTime(), baeldungDate.getTime());
    }
}

4. 导入最常用的类

我们导入最常用的那个,并通过完整路径导入最少使用的那个,这是Java开发者中最常见的技巧和最佳实践:

import java.util.Date;

public class DateUnitTest {

    @Test
    public void whenImportTheMostUsedOne() {

        Date javaDate = new Date();
        com.baeldung.date.Date baeldungDate = new com.baeldung.date.Date(javaDate.getTime());

        Assert.assertEquals(javaDate.getTime(), baeldungDate.getTime());
    }
}

5. 总结

本文展示了根据特定情况使用同名类的两种可能方法,并观察了它们之间的主要差异。如往常一样,本文的完整代码示例可在GitHub上找到。