删除类歧义而不过分冗长

时间:2011-05-29 14:45:58

标签: java namespaces import

我正在使用一个Java库,其目录结构如下所示:

/com
  /example
    /LibX
      Server.java
      Client.java

现在,从使用上述类的项目来看,在我看来,导入com.example.LibX.*和使用Client client = new Client(...);有点含糊不清,因为“客户端”可能意味着什么。因此,我尝试了以下方法,只收到“未找到包”错误:

import com.example.*;

LibX.Client client = new LibX.Client(...);

有可能做我描述的吗?或者是否有其他方法可以在不使用com.example.LibX.Client的情况下消除歧义?

4 个答案:

答案 0 :(得分:3)

Java包不是分层的,即使它们有时看起来像它。正如您所建议的那样,您无法导入包的“树”。您需要使用通配符导入特定包,或者导入特定的类名,或者直接在代码中使用完全限定的类名。

以下内容并不含糊,被认为是最佳做法:

import com.example.LibX.Client;

...

Client client = new Client(...);

在IDE可以为您组织导入的世界中,没有理由不明确说明它们。

答案 1 :(得分:2)

你对歧义的关注是不必要的 - 如果你有一个模糊的引用,你的课程将无法编译 - 例如

import java.util.Date;
import java.sql.Date;

public class Test {

        private Date date;
}

不会编译。因此,如果您可以编译该类,那么根据定义,您没有不明确的引用。

顺便说一句,LibX.Client有点令人困惑。通常类名是大写的,包名称是小写的,所以如果你这样做(如果LibX是顶级包并且你给出了全名)它看起来更像是内部类引用,就像上面的Andy的回应一样。

答案 2 :(得分:1)

如果您愿意将Client和Server分组为静态嵌套类,则可能会这样做。

public class LibX {
  public static class Client {
    //...
  }

  public static class Server {
    //...
  }
}

现在您可以import mypak.LibX然后执行new LibX.Client()。这有一个令人遗憾的缺点,就是强迫你将类分组并创建额外的空LibX类。

答案 3 :(得分:0)

没有像你描述的那样的机制。您唯一的另一种可能性是使用单一类导入:

import com.example.LibX.Client;