我是一个新手,刚学到了,如果我说的定义
package my.first.group.here;
...
那么Java文件,这些文件在此包将被放置在my/first/group/here
目录。
把一些Java文件包的主要目的是什么? 另外,如果我选择采用这一点,我应该如何组呢?
谢谢
编辑:对于任何人谁可能再有同样的问题,我只是发现这个教程包从Sun
我是一个新手,刚学到了,如果我说的定义
package my.first.group.here;
...
那么Java文件,这些文件在此包将被放置在my/first/group/here
目录。
把一些Java文件包的主要目的是什么? 另外,如果我选择采用这一点,我应该如何组呢?
谢谢
编辑:对于任何人谁可能再有同样的问题,我只是发现这个教程包从Sun
让我们从一个“Java包”的定义开始,作为中描述的维基百科的文章 :
一个Java包是用于组织Java类成类似于MODULA的模块名称空间的机构。 Java包可以存储在一个名为JAR文件的压缩文件,允许类,下载速度更快作为一个群体,而不是一次一个。 程序员通常还用包来组织属于同一类别或提供类似功能的类。
因此,基于的是, 在Java包只是用来组织类和防止类名称冲突的机制 。 你能说出他们任何你希望的,但Sun公司已经公布了一些命名约定命名包时,你应该使用:
包
独特的包名的前缀总是全部小写的ASCII字母,应该是顶级域名之一,目前COM,EDU,GOV,MIL,净,组织,英文两字母代码或一个在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());
}
}
包是给了类分离的灵活性非常重要。 它们可用于:
例如
com.mycompany.thisproject.thismodule.web
可能表明一些模块的web层。
最后,还有我们要在Java中使用包3个的核心原因。
1) 易于维护
组织classes
成packages
遵循通过封装原则关注点分离,并允许在整个系统设计更好的凝聚力。 进一步搬家,包装按功能允许开发团队找到相关的类和接口进行更改,支持垂直切片技术在敏捷方法中使用比例的方法。 欲了解更多信息,请参阅博客文章: 由功能而不是由图层打包你的类和包装的垂直切片:编码 。
2) 提供包装安全
软件包允许外部访问只有public
访问修饰符在包含类的方法。 使用protected
或没有修改,就只有同一个包中的类访问。 欲了解更多信息,请参见后: 哪些Java访问修饰符允许会员只有在其他包中的子类进行访问?
3) 避免类似的命名
类似.NET的命名空间,类名都包含其包含的包的范围之内。 这意味着,两个相互排斥的包可以包含具有相同名称的类。 这是因为这些包本身有不同的名称,因此,完全合格的名称是不同的。 欲了解更多信息,请参见教程[命名程序包:Java教程] [3]。
从维基百科的专题页面:
“Java包是组织Java类成类似于Java包可以存储在一个名为JAR文件的压缩文件的MODULA。模块命名空间,允许类,下载速度更快作为一个群体,而不是一次一个机制,程序员通常还使用软件包组织属于同一类别或提供类似功能的类。”
另外,如果我选择采用这一点,我应该怎么组呢?
这在很大程度上取决于设计模式(S),你会在你的项目中使用。 在大多数情况下(特别是,如果你是相当新的),你会想按功能或一些其他的逻辑相似组他们。
其他人都提供了非常Java的具体答案,这都很好,但这里有一个比喻:为什么你组织你的硬盘驱动器上的文件到目录? 为什么不只是有一个目录中的一切平面文件系统?
答案当然是包提供组织。 与数据库接口程序的一部分,是比显示UI给用户的程序的一部分不同,所以他们会在不同的包。
目录一样,它也提供了一种方法来解决命名冲突。 你可以在你可能也会出现在不同的包装两大类以同样的方式一对夫妇不同的目录一TEMP.TXT。 这将成为重要(1)当您启动互联网或(2)即使实现Java的类加载是如何工作的结合上与其他人的代码在那里。
关于包的另一个重要的事情是保护访问控制成员。
受保护的地方是公共的(每个人都可以访问)和私人(只有内部类可以访问)之间。 标记为受保护的东西可以从同一个包内,或者从子类进行访问。 这意味着,对于有限的访问,你不必把一切都在同一个班级。
Java是十分严谨的执行。 它并不真正留有余地捏造。
如果每个人都使用相同的包,他们必须找到一些“万维网”的方式,以确保没有两个类名曾经相撞。
这让每一个类写过嵌入自己的“地方”你不必看,如果你不想。
你可能在你的系统上的4米不同的地方定义的不同“点”的对象,但你的类将只使用你所期望的一个(因为您导入一个)。
他们确保每个人都有自己的空间的方法是使用你的反向域名,所以我的是“tv.kress.bill”。 我承认域 - 实际上,我和我的兄弟“tv.kress.doug”分享它,即使我们分享同一个域,我们不能有冲突。
如果一百部门在公司中的每个Java中发展,他们可以这样做没有碰撞知道到底怎么分的。
没有做这种划分的系统现在似乎真的片状我。 我可能会用它们来破解在一起的东西,个人的脚本,但我觉得不舒服开发什么大而不一些严格的包装回事。