【问题标题】:Can I specify a "base package path" for a directory in Java?我可以为 Java 中的目录指定“基本包路径”吗?
【发布时间】:2013-12-22 02:05:08
【问题描述】:

如果我有一个Java包,例如:

package org.foo.bar.stuff;

我可以将源文件.java 存储在目录src/org/foo/bar/stuff 中,前提是我将src/ 添加到我的类路径中。在这个例子中,目录内容树是这样的:

`-- src
    `-- org
        `-- foo
            `-- bar
                `-- stuff
                    |-- ICat.java
                    `-- IMouse.java

如果我可以定义一个“基本”包名,例如。 org.foo.bar 对于像/stuff 这样的目录,树可能会变成这样:

`-- src
    `-- stuff  # has defined base "org.foo.bar"
        |-- ICat.java
        `-- IMouse.java

技术上是否有一种方法来定义“基本”包名称,即。 org.foo.bar,对于像/stuff 这样的目录,为了避免嵌套目录?

【问题讨论】:

  • 没有。但是你可以使用内部类来实现类似的东西。
  • @ElliottFrisch 不会改变访问修饰符或信息隐藏吗?你能举个例子吗?
  • @Chris 我可以方便地“按我的方式”工作,并在发布时将树转换为标准结构。无论嵌套目录最终用于消除歧义多么有用,但它们使用起来很烦人(即使是像 Eclipse 这样的 IDE 也将它们分组)。
  • 听起来您仍然在解决真正的问题。 Eclipse 可以选择将空目录合并为一行。
  • @Chris 是的,我认为“分组”的意思是一样的。真正的问题是,如果有其他方便的方式来浏览源代码树而不是 IDE,我很感兴趣,即。 shell/命令行,mc,标准工具,等等。我的意思是,如果没有任何选项,我可以只使用 IDE,但值得一问。

标签: java directory nested classpath packages


【解决方案1】:

虽然 Java 规范没有强制执行它,但所有知名编译器都使用目录结构。该规范明确规定了一个用于存储类的数据库,它根本不使用任何目录。

简短回答:如果您使用标准 Java 工具,则无法避免嵌套目录。

7.2. Host Support for Packages

每个主机系统决定包和编译单元的方式 创建并存储。

...

在 Java SE 平台的简单实现中,包和 编译单元可以存储在本地文件系统中。其他 实现可以使用分布式文件系统或一些 数据库形式。

如果主机系统将包和编译单元存储在数据库中, 那么数据库不得将可选限制(§7.6)强加于 基于文件的实现中允许的编译单元。

...

但是,使用数据库的系统必须提供一个选项 出于目的,将程序转换为遵守限制的形式 导出到基于文件的实现。

(听起来您正在解决真正的问题。)

【讨论】:

  • 我明白了。我不是在尝试优化,这只是一个暂时的转变。看我的评论。我想我可以暂时重命名整个包。 :)
  • 为了延长答案,您是否熟悉 JLS 中定义这个的部分?
  • @naxa:好问题。规范并没有我想象的那么严格。
【解决方案2】:

虽然可以这样做,但我不一定赞同。 如果(出于某种原因)你不想将你的类嵌套到包中,你可以将你的类嵌套在你的类中(如果你真的想要的话)......

package it.is.a;

public class Demo {
  public static class A {}
  public static class B {}
}

然后it.is.a.Demo.Ait.is.a.Demo.BDemo 分组。

【讨论】:

  • 这对导入效果好吗?
  • 虽然这可以解决上述问题,但您并不认为这是一个好主意,是吗? ;)
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2023-01-11
  • 2016-07-21
  • 2016-04-29
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多