代码之家  ›  专栏  ›  技术社区  ›  The Surrican

这两个java变量声明有什么区别?

  •  2
  • The Surrican  · 技术社区  · 14 年前
    public class SomeClass {
        private HashSet<SomeObject> contents = new HashSet<SomeObject>();
        private Set<SomeObject> contents2 = new HashSet<SomeObject>();
    }
    

    HashSet 不是吗?第二个在我看来是错误的,但我经常看到它被使用,接受和工作。

    5 回复  |  直到 8 年前
        1
  •  22
  •   Community Egal    7 年前

    Set 是一个接口,并且 HashSet 是一个实现 接口。

    将变量声明为类型 散列集 可以使用。如果您需要 .

    如果您不需要 散列集 ,最好将变量声明为类型 . 这使得确切的实现在以后可以更改。您可能会发现,对于正在使用的数据,不同的实现效果更好。通过使用接口,您可以在以后根据需要进行此更改。

    您可以在此处查看更多详细信息: When should I use an interface in java?

        2
  •  3
  •   Tyler Treat    14 年前

    Set是HashSet实现的集合接口。

    第二种选择通常是理想的选择,因为它更通用。

        3
  •  3
  •   stew    14 年前

        4
  •  3
  •   wkl    14 年前

    Set 是一个接口 HashSet 实现,因此如果执行此操作:

    Set<E> mySet = new HashSet<E>();

    您仍然可以访问 ,但您也可以灵活地将具体实例替换为另一个实例 将来的课程,例如 LinkedHashSet TreeSet ,或其他实现。

    第一个方法使用一个具体的类,允许您用自己的实例或子类替换该类,但灵活性较低。例如, 有序树 如果变量类型为 散列集 .

    Effective Java, 2nd Edition .

    ... 您应该倾向于使用接口而不是类来引用对象。 如果存在适当的接口类型,那么参数、返回值、变量和字段都应该使用接口类型声明。 唯一真正需要引用对象类的时间是在使用构造函数创建它时。。。

    //

    List<T> tlist = new Vector<T>();

    // 典型的错误-使用具体的类作为类型!

    Vector<T> vec = new Vector<T>();

    例如, Vector<T> synchronized ArrayList<T> (也是 List<T> )不需要,因此如果在设计中需要同步容器(或不需要),则需要记录该容器。

        5
  •  2
  •   Eugene Kuleshov    14 年前

    值得一提的是,对于API中公开的类型(例如方法参数或返回类型),接口与具体类规则的比较是最重要的。对于私有字段和变量,它只确保您不使用具体实现(即HashSet)中的任何方法,但是它是私有的,所以这并不重要。

    另一件事是添加另一个类型引用将稍微增加编译类的大小。大多数人不会在意,但这些东西加起来。