【发布时间】:2013-10-03 07:02:08
【问题描述】:
有时,当我查看源 java 代码时,我注意到一些文件放置在默认包之外的另一个包中,但不明白何时或为什么使用这种做法。是否存在必须或不能使用单独包的情况?有人愿意解释一下吗?
【问题讨论】:
-
最好让您了解 java 如何在不同包下组织类,以及一个包中的类与另一个包中的类有何不同。你会得到答案的。
有时,当我查看源 java 代码时,我注意到一些文件放置在默认包之外的另一个包中,但不明白何时或为什么使用这种做法。是否存在必须或不能使用单独包的情况?有人愿意解释一下吗?
【问题讨论】:
当您的项目需要特定的组织或层次结构,或者当您的框架不允许使用默认包时,请使用包。对于简单的 CS 项目,这可能是矫枉过正。
包是 Java 可识别的文件夹,可让您获得某些特权:
您可以将两个同名的类放在不同的文件夹中,而不会引起冲突。
一个常见的例子是java.util.Date 和java.sql.Date;根据您的操作,您可能会使用both。如果这样做,则必须使用fully qualified class name,这就像写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));
}
}
【讨论】:
我们有包,它们只是逻辑名称空间,用于区分两个同名的类。第二种用途是将执行一项任务的通用类组合在一起作为一个命名空间(java.io,java.sql)。
【讨论】:
包是一种将 Java 类组织到命名空间中的机制,类似于 Modula 的模块。
Java 包可以存储在称为 JAR 文件的压缩文件中,允许类作为一个组下载而不是一次下载一个。
程序员通常还使用包来组织属于同一类别或提供类似功能的类。
通过为包提供适当的名称,将清楚地给出特定包中存在的类的使用情况的高级图片。
例子:
com.sample.Ejb;
com.sample.EjbImpl;
com.sample.Delegate;
com.sample.Utility;
【讨论】: