[英]why we use prefix “java.io.” everytime and not import java.io.Serializable interface
我的问题不是要了解对可序列化接口的使用的技术理解。 这些问题的答案已经解释[1]及[2]中的人
我的问题是从句法角度来看的。
在查看Collection接口及其子接口的源代码时,我注意到大多数接口都实现了Cloneable
和java.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
中的所有类和接口都是自动可见的。 鉴于以下规则:
AbstractSet
和NavigableSet
与TreeSet
在同一程序包中,因此自动可见。 Cloneable
在自动可见的java.lang
中。 Serializable
在java.io
,因此进行了明确声明(但也可以与导入一起使用)。 在询问为什么在大多数情况下为什么要使用显式声明或导入时,这取决于样式。 在大多数情况下,使用导入是因为它可以使代码更整洁。
唯一的例外是当使用两个或更多个同名的类或接口时。 在这种情况下,您应该明确声明每个用法。
您提到的类( TreeSet
, LinkedHashSet
等)根本没有任何导入,并且如果它属于java.lang
或java.util
以外的包,则始终使用完整的类名。
我会说这是一种不好的做法,但我们不能怪约什·布洛赫先生():
有一个接口sunw.io.Serializable
,因此他们很可能想区分这两个。 但是,无法说出其真正原因是什么。 也许这是一项政策,也许由于导入错误的错误而导致调试困难。
这背后没有充分的理由。 这些类没有其他导入语句,而Serializable
在这些文件中仅在一个位置被引用,因此很容易看出为什么作者可能更愿意不导入。
另外,OpenJDK 8中的TreeMap
既包含import语句,又使用完全限定的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.