什么时候在java中使用单独的包?

时间:2013-09-27 04:57:03

标签: java package

有时当我查看源代码时,我注意到除了默认代码之外的一些文件放在另一个包中,但是没有理解使用这种做法的时间或原因。您是否必须使用单独的包装?有人在乎解释吗?

7 个答案:

答案 0 :(得分:7)

答案简短:

当项目需要特定的组织或层次结构时,或您的框架不允许使用默认包时,请使用包。对于简单的CS项目,它可能过度。

答案越长:

包是Java识别的文件夹,允许您获得某些特权:

  • 您可以将两个名称相同的类放在不同的文件夹中,而不会导致冲突。

    一个常见示例是java.util.Datejava.sql.Date;取决于你正在做什么,你最终可能会使用两个。如果你这样做,你必须使用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

我会继续,但从这里开始变得有点疯狂。

我所拥有的是对项目的层次感和结构感。这是一个相当大的项目,所以我可以从组织中受益。

答案 1 :(得分:5)

包是以某种方式对相关类进行分组的好方法。它还提供了一种机制,可以将对类的某些方面的访问限制为仅限于同一个包中的其他类 - 这在尝试隐藏类的实现(核心面向对象原则)时很有用。

答案 2 :(得分:5)

软件包最重要的用途是将代码组织到比单个类更大的模块中。

默认情况下(除非您公开它们)字段,方法和类对同一个包之外的代码不可见。这提供了“信息隐藏”并强制执行模块的解耦(这样它们只能通过公共接口进行通信,您可以单独更改每个包的实现细节)。

答案 3 :(得分:3)

  

程序被组织为一组包。每个包都有自己的类型名称,这有助于防止名称冲突。

     

对于小程序和临时开发,包可以是未命名的或具有简单的名称,但是如果要广泛分发代码,则应使用限定名称选择唯一的包名称。这可以防止在两个开发组碰巧选择相同的包名称并且稍后将在单个程序中使用这些包时发生的冲突。

其他人language specification

答案 4 :(得分:2)

何时在java中使用Separate包:

让我们举个例子来支持这个问题。

假设您有一个处理数据库连接的java程序,它还需要两个独立的线程来执行此任务,并且还需要一些arraylist来存储从数据库中检索的数据库信息。  在这种情况下,它很容易使用package.If我需要数据库包我知道它在哪里我只需导入我的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));
     }
   }

答案 5 :(得分:1)

我们有包,它们只是逻辑命名空间,用于区分具有相同名称的2个类。第二种用法是将执行一项任务的公共类组合为一个名称空间(java.iojava.sql)。

答案 6 :(得分:1)

包是一种将Java类组织成名称空间的机制,类似于Modula的模块。

Java包可以存储在称为JAR文件的压缩文件中,允许类作为一个组而不是一次一个更快地下载。

程序员通常还使用包来组织属于同一类别或提供类似功能的类。

通过为包提供正确的名称,将清楚地给出关于包中存在的类的使用的高级图片。

示例:

com.sample.Ejb;
com.sample.EjbImpl;
com.sample.Delegate;
com.sample.Utility;