繁体   English   中英

为什么我们每次都使用前缀“ java.io”而不导入java.io.Serializable接口

[英]why we use prefix “java.io.” everytime and not import java.io.Serializable interface

我的问题不是要了解对可序列化接口的使用的技术理解。 这些问题的答案已经解释[1][2]中的

我的问题是从句法角度来看的。

在查看Collection接口及其子接口的源代码时,我注意到大多数接口都实现了Cloneablejava.io.Serializable ,如下所示:

public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable{
...
}


public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}

public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}

...等等

我还注意到:

  • Collection接口, TreeSet LinkedHashSet等属于package java.util;
  • Cloneable接口属于package java.lang;
  • Serializable属于package java.io;

现在我的问题是为什么我们要在Serializable之前添加前缀java.io (如上所示)而不导入import java.io.Serializable; 就像在Collection界面中所做的一样。

Java导入的工作方式如下:

  • java.lang中的所有类和接口都是自动可见的。
  • 同一包中的任何类或接口都将自动对该包中的其他类和接口可见。
  • 必须明确声明(包和类名)或导入另一个包中的任何类或接口。

鉴于以下规则:

  • AbstractSetNavigableSetTreeSet在同一程序包中,因此自动可见。
  • Cloneable在自动可见的java.lang中。
  • Serializablejava.io ,因此进行了明确声明(但也可以与导入一起使用)。

在询问为什么在大多数情况下为什么要使用显式声明或导入时,这取决于样式。 在大多数情况下,使用导入是因为它可以使代码更整洁。

唯一的例外是当使用两个或更多个同名的类或接口时。 在这种情况下,您应该明确声明每个用法。

您提到的类( TreeSetLinkedHashSet等)根本没有任何导入,并且如果它属于java.langjava.util以外的包,则始终使用完整的类名。

我会说这是一种不好的做法,但我们不能怪约什·布洛赫先生():

有一个接口sunw.io.Serializable ,因此他们很可能想区分这两个。 但是,无法说出其真正原因是什么。 也许这是一项政策,也许由于导入错误的错误而导致调试困难。

这背后没有充分的理由。 这些类没有其他导入语句,而Serializable在这些文件中仅在一个位置被引用,因此很容易看出为什么作者可能更愿意不导入。

另外,OpenJDK 8中的TreeMap既包含import语句,又使用完全限定的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM