Sometimes when I view source java code I notice some files placed in another package besides the default one but have not understood when or why this practice is used. Are there situations where you must or mustn't use separate packages? Anyone care to explain please?
7 回答
简短的回答:
当您的项目需要特定的组织或层次结构时,或者当您的框架不允许使用默认包时,请使用包。对于简单的 CS 项目,这可能是矫枉过正。
更长的答案:
包是 Java 识别的文件夹,它允许您获得某些特权:
您可以有两个名称相同的类,它们位于不同的文件夹中,而不会引起冲突。
一个常见的例子是
java.util.Date
andjava.sql.Date
; 根据你在做什么,你可能会同时使用. 如果这样做,则必须使用完全限定的类名,这就像写作java.util.Date date = new java.util.Date();
.你给你的项目一种层次感和组织感;给每个班级一个合理的“生活”场所。
- 具有包私有方法和/或字段的类将无法跨包边界访问,这在某些情况下可能是可取的。
以我目前的项目为例。我决定编写一个元数据解析器来读取 MP3、FLAC、Vorbis 和 AAC 文件。
马上,我有四个常用接口:
MP3
FLAC
Vorbis
AAC
...但是,这些都是真正的压缩格式(FLAC 是无损的,所以那里没有压缩),所以它们属于传达这一点的地方。
name.makoto.format
- MP3
- FLAC
- Vorbis
- AAC
这一切都很好,花花公子。但是实际进行解析的类会在哪里?如果它存在于阅读器包中怎么办?
name.makoto
- reader
MediaReader
- format
MP3
FLAC
Vorbis
AAC
假设现在我想实现那些格式接口。让它们与接口本身处于同一级别是没有意义的,因为它们只是实际对象的 API。让我们把它移到一个impl
包中。
name.makoto
- reader
MediaReader
- format
MP3
FLAC
Vorbis
AAC
- impl
MP3Impl
FLACImpl
VorbisImpl
AACImpl
我会继续,但从这里开始有点疯狂。
我在这里所拥有的是我的项目的层次感和结构感。这是一个相当大的项目,所以我可以从这个组织中受益。
包是对以某种方式相关的类进行分组的好方法。它还提供了一种机制来限制对类的某些方面的访问,仅限于同一包中的其他类——这在试图隐藏类的实现时很有用(面向对象的核心原则)。
包最重要的用途是将代码组织成比单个类更大的模块。
默认情况下(除非您将它们设为公共)字段、方法和类对同一包外的代码不可见。这提供了“信息隐藏”并强制解耦您的模块(以便它们只能通过公共接口进行通信,并且您可以独立更改每个包的实现细节)。
程序被组织成一组包。每个包都有自己的一组类型名称,这有助于防止名称冲突。
对于小型程序和临时开发,包可以不命名或具有简单名称,但如果要广泛分发代码,则应使用限定名称选择唯一的包名称。这可以防止如果两个开发组碰巧选择相同的包名称并且这些包后来在单个程序中使用时可能发生的冲突。
其他按语言规范
何时在 java 中使用单独的包:
让我们举个例子来支持这个问题。
假设您有一个处理数据库连接的 java 程序,它还需要两个单独的线程来执行此任务,还需要一些数组列表来存储从数据库中检索到的数据库信息。在这种情况下,使用包非常容易。如果我需要数据库包,我知道它在哪里,我只需导入我的java.sql package
如果我必须处理线程,我将使用java.lang.Thread
包。我必须处理 arraylist 然后我将使用我的java.util
包。想想根据您的需要导入包是多么简单。
此外,假设您实现了自己的包来执行两个数字的加法、乘法、减法。那么您将要做的就是创建一个简单的包来处理这些操作。并且您可以在任何需要的地方使用这个包那些操作,那么您将不需要每次在您的应用程序中为这些操作编写代码。
例如
package Arithmetic;
public class Operations
{
public long sum(long a ,long b)
{
return a+b;
}
public long subtraction(long a,long b)
{
return a-b;
}
public long multiply(long a,long b)
{
return a*b;
}
}
现在我可以将这个包用于另一个类
import Arithmetic.*;
class Demo
{
public static void main(String...k)
{
Operations op=new Operations();
System.out.println(op.sum(12,23));
System.out.println(op.multiply(23,23));
System.out.println(op.subtraction(342,23));
}
}
我们有包,它们只是逻辑名称空间,用于区分 2 个具有相同名称的类。第二个用途是将执行一项任务的公共类组合在一起作为一个命名空间(java.io
,java.sql
)。
包是一种将 Java 类组织到命名空间中的机制,类似于 Modula 的模块。
Java 包可以存储在称为 JAR 文件的压缩文件中,从而允许类作为一个组而不是一次下载一个更快。
程序员通常还使用包来组织属于同一类别或提供类似功能的类。
通过为包提供正确的名称,将清楚地给出特定包中存在的类的使用情况的高级图片。
例子:
com.sample.Ejb;
com.sample.EjbImpl;
com.sample.Delegate;
com.sample.Utility;