【问题标题】:why we use prefix "java.io." everytime and not import java.io.Serializable interface为什么我们使用前缀“java.io”。每次都不导入 java.io.Serializable 接口
【发布时间】:2015-03-13 19:39:05
【问题描述】:

我的问题不是关于理解对 Serializable 接口使用的技术理解。 这些答案已经在others[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接口,TreeSetLinkedHashSet等属于package java.util;
  • Cloneable 接口属于package java.lang;
  • Serializable 属于 package java.io;

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

【问题讨论】:

    标签: java serialization import


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这就是 Java 导入的工作方式:

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

      鉴于这些规则:

      • AbstractSetNavigableSetTreeSet 在同一个包中,因此自动可见。
      • Cloneable 位于自动可见的 java.lang 中。
      • Serializablejava.io 中,因此明确声明(但也适用于导入)。

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

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

      【讨论】:

      • 正如@Kayaman 所建议的那样,真的可以区别于sunw.io.Serializable(在this answer 中)
      • 这可能就是原因,尽管 sunw.io.Serializable 在多年前已被弃用,我当然会假设当我看到 Serializable 时它是 java.io.Serializable
      【解决方案3】:

      有一个接口sunw.io.Serializable,所以他们很可能想区分这两者。但是,无法说出造成这种情况的实际原因是什么。也许这是政策,也许他们因为导入错误而遇到了难以调试的错误......

      【讨论】:

        【解决方案4】:

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

        另一个有趣的地方是,OpenJDK 8 中的TreeMap 既包含导入语句,又使用完全限定名称。

        【讨论】:

        • 我安装的 java 'jdk1.7.0_51' TreeMap 没有任何导入但使用 java.io.Serializable 报告其他情况。
        • 如果没有特殊限定,您应该假设我说的是 当前 OpenJDK 版本(在撰写本文时它是 8)。
        猜你喜欢
        • 1970-01-01
        • 2018-04-25
        • 2018-07-02
        • 1970-01-01
        • 2020-10-27
        • 2020-12-28
        • 2014-02-19
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多