我是一个新手,刚刚了解到如果我定义说

package my.first.group.here;
...

那么这个包中的Java文件将被放置在 my/first/group/here 目录。

将一些Java文件放入包中的主要目的是什么?另外,如果我选择采用这个,我应该如何将它们分组?

谢谢


编辑:对于可能再次有同样问题的人,我刚刚发现 这个关于包的教程 来自太阳。

有帮助吗?

解决方案

让我们从“Java 包”的定义开始,如 维基百科文章:

Java 包是一种机制 将 Java 类组织成 命名空间类似于 Modula的。Java 包可以存储在 称为JAR文件的压缩文件, 允许类下载速度更快 一组,而不是一次一个。程序员通常还使用 用于组织属于的类的包 到同一类别或提供 类似的功能。

所以基于此, Java中的包只是一种用于组织类和防止类名冲突的机制. 。您可以随意命名它们,但 Sun 已经发布了一些 命名约定 那你 应该 命名包时使用:

套餐

唯一包名称的前缀是 始终以全小写 ASCII 编写 字母,并且应该是其中之一 顶级域名,目前为com、 EDU、GOV、MIL、NET、ORG 或其中之一 英文双字母代码识别 ISO标准中规定的国家/地区 3166, 1981.

随后的包装名称的组件根据组织自己的内部命名约定而有所不同。此类公约可能 指定特定目录名称 组件是部门、部门、 项目、计算机或登录名。

例子:

  • com.sun.eng

  • com.apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

其他提示

我一个大的应用程序,你就一定能有一个名为完全相同(java.util.Date和java.sql.Date)两个文件,尤其是当你开始引进第三方罐子。所以基本上,你可以使用的软件包来保证唯一性。

最重要的是,在我看来,包装分解项目进入有意义的细分。所以,我的SQL包具有SQL相关的代码,我的记录器包处理记录。

它允许程序从多个不同的程序/组件/库组成,让自己的类名称不会冲突和组件更容易组织。请参见 http://java.sun.com/docs/books /tutorial/java/package/index.html

在Java中的习惯来命名包反向域名。例如,如果你的公司的域名是“initech.com”和你是一个名为“小玩意儿”计划,包名通常为前缀“com.initech.gizmo”,与子包程序的不同组成部分。

在除了在其他的答案中提到的命名空间,可以限制接入到基于该构件上声明的范围的方法和字段。 大家用的公共的范围内都可以随意访问,限制访问你通常它们定义的私人的(即隐藏在类外)。 您还可以使用的保护的范围限制访问的类型和它的孩子。 也有默认范围(没有限定词的构件已经默认范围),它允许儿童类型和类型中的构件相同的包的访问。这可以是共享的属性和方法没有让他们太广泛使用的有效方式,并能与测试帮助。

例如下面的方法将是可见的同一个包的所有其他成员。

public class Foo {
    int doSomething() {
        return 1;
    }
}

要测试可以定义在相同的封装的另一类型(但可能不同的源位置)的方法,该类型将能够访问该方法

public class FooTest {
    @Test
    int testDoSomething() {
        Foo foo = new Foo();
        assertEquals(1, foo.doSomething());
    }
}

包对于提供类分离的灵活性非常重要。它们可用于:

  • 分离项目
  • 分离模块
  • 分离应用程序层(业务、Web、Dao)
  • 进一步细粒度的代码分离

例如

com.mycompany.thisproject.thismodule.web

可以表示某个模块的web层。

最后,有3倍核心的原因,我们希望在Java中使用的软件包。

1)的维护更容易

组织classespackages如下的通过封装原理关注点分离并允许在整个系统的设计更好的凝聚力。进一步搬家,包装按功能允许开发团队找到相关的类和接口进行更改,支持垂直切片技术在敏捷方法中使用比例的方法。欲了解更多信息,请参阅博客文章:由功能而不是由层和的编码:由垂直切片包装

2)的提供封装安全

软件包允许外部访问仅public访问修饰符在包含的类的方法。使用protected或没有修改,就只有同一个包中的类访问。欲了解更多信息,请参见后: 哪些Java访问修饰符允许通过在其他包中的子类只访问注册了吗?

3)的避免类似的命名

到.NET的命名空间类似,类名都包含其含有包的范围之内。这意味着,两个相互排斥的包可以包含具有相同名称的类。这是因为这些包本身有不同的名称,因此,完全合格的名称是不同的。有关详细信息,请参阅教程[命名软件包:Java教程]。[3]

维基在话题页:

“A Java包是用于组织Java类成类似于可被存储在称为JAR文件的压缩文件MODULA。Java包中的模块的名称空间,允许类下载速度更快作为一组,而不是一次一个的机构。程序员通常还使用包来组织属于相同类别或提供类似功能的类。“

  

另外,如果我选择采用该如何   我应该组他们?

这在很大程度上取决于设计模式(S),你会在你的项目中使用。在大多数情况下(特别是,如果你是相当新的),你会按功能或一些其他的逻辑相似希望他们组。

其他人都提供了非常Java的具体答案,这都很好,但这里有一个比喻:为什么你组织你的硬盘驱动器上的文件到目录?为什么不与一切平面文件系统中的一个目录?

答案,当然是包提供组织。与数据库接口程序的部分比显示UI给用户的程序的部分的不同,所以他们会在不同的封装中。

像目录,它也提供了一种方法来解决名称冲突。你可以在你可能也会出现在不同的包装两大类以同样的方式一对夫妇不同的目录一TEMP.TXT。这将成为重要(1)当您启动互联网或(2)即使实现Java的类加载是如何工作的。

这是结合了其他人的代码在那里

Java是十分严谨的执行。它并不真正留有余地捏造。

如果大家都使用相同的包,他们必须找到一些“万维网”的方式,以确保没有两个类名曾经相撞。

这让每一个类写过嵌入自己的“地方”你不必看,如果你不想。

您可以在您的系统上4米不同的地方定义的不同“点”的对象,但你的类将只使用你所期望的一个(因为您导入一个)。

他们确保每个人都有自己的空间的方法是使用你的反向域名,所以我的是“tv.kress.bill”。我承认域 - 实际上,我和我的兄弟“tv.kress.doug”分享它,即使我们分享同一个域,我们不能有冲突

如果一百部门在公司中的每个Java中发展,他们可以这样做没有碰撞知道到底怎么分的。

这是不做这种划分的系统现在似乎真的片状我。我可能会用它们来破解在一起的东西,个人的脚本,但我觉得不舒服开发什么大而不一些严格的包装回事。

scroll top