什么';这两个java变量声明之间的区别是什么? 公共类SomeClass{ 私有HashSet contents=新HashSet(); 私有集contents2=新HashSet(); }
有什么区别?最后它们都是HashSet,不是吗?第二个在我看来是错误的,但我看到它经常被使用、接受和工作。集是HashSet实现的一个集合接口什么';这两个java变量声明之间的区别是什么? 公共类SomeClass{ 私有HashSet contents=新HashSet(); 私有集contents2=新HashSet(); },java,variables,set,declaration,hashset,Java,Variables,Set,Declaration,Hashset,有什么区别?最后它们都是HashSet,不是吗?第二个在我看来是错误的,但我看到它经常被使用、接受和工作。集是HashSet实现的一个集合接口 第二个选项通常是理想的选择,因为它更通用。Set是一个接口,HashSet是一个实现Set接口的类 将变量声明为typeHashSet意味着不能使用Set的其他实现。如果需要HashSet的特定功能,您可能需要此功能 如果不需要HashSet中的任何特定功能,最好将变量声明为typeSet。这使得具体的实现留待以后更改。您可能会发现,对于正在使用的数据,
第二个选项通常是理想的选择,因为它更通用。
Set
是一个接口,HashSet
是一个实现Set
接口的类
将变量声明为typeHashSet
意味着不能使用Set
的其他实现。如果需要HashSet
的特定功能,您可能需要此功能
如果不需要HashSet
中的任何特定功能,最好将变量声明为typeSet
。这使得具体的实现留待以后更改。您可能会发现,对于正在使用的数据,不同的实现效果更好。通过使用该接口,您可以在以后根据需要进行此更改
您可以在此处看到更多详细信息:由于HashSet类实现Set接口,因此将HashSet分配给Set变量是合法的。但是,您不能走另一条路(将一个集合分配给更具体的HashSet变量)。
Set
是一个由HashSet
实现的接口,因此如果您这样做:
Set mySet=new HashSet()代码>
您仍然可以访问HashSet
的功能,但您也可以灵活地在将来用另一个Set
类的实例替换具体实例,例如LinkedHashSet
或TreeSet
,或其他实现
第一种方法使用一个具体的类,允许您用自身的实例或子类替换该类,但灵活性较低。例如,如果变量类型为HashSet
,则无法使用TreeSet
这是Joshua Bloch的第52项
通过对象的接口引用对象
。。。您应该倾向于使用接口而不是类来引用对象如果存在适当的接口类型,则参数、返回值、变量和字段都应使用接口类型声明。真正需要引用对象类的唯一时间是使用构造函数创建对象时
//通常良好-使用接口作为类型
List tlist=new Vector()代码>
//通常不好-使用具体类作为类型强>
Vector vec=new Vector()代码>
这种做法确实有一些警告——如果您想要的实现具有通用接口无法保证的特殊行为,那么您必须相应地记录您的需求
例如,Vector
是synchronized
,而ArrayList
(也是List
的实现者)则不是,因此如果您在设计中需要(或不需要)同步容器,您需要记录这一点。值得一提的是,接口与具体类规则对于API中公开的类型最为重要,例如方法参数或返回类型。对于私有字段和变量,它只确保您不使用来自具体实现(即HashSet)的任何方法,但它是私有的,因此并不重要
另一件事是,添加另一个类型引用将略微增加编译类的大小。大多数人都不会在意,但这些都是重要的。我建议大家先温习一下一般的面向对象编程概念。要扩展其他人所说的内容,第二个是对接口编程,第一个是使用一个特定的实现。@colithium-我认为这正是OP所做的……好吧,谢谢各位,我明白了:)尽管我发现大多数人支持一个不那么严格的声明,这有点矛盾。这是不是在某种程度上破坏了这个概念?请容忍我,我来自php世界,在那里你可以乘字符串…我只想添加一个链接到这个问题:什么时候最好在java中使用un接口,谢谢,我添加了这个链接,因为它似乎有额外的细节,我没有包括关于何时使用每一个。@Tony Ennis-谢谢!这是迄今为止我对一个答案投的最多票。
public class SomeClass {
private HashSet<SomeObject> contents = new HashSet<SomeObject>();
private Set<SomeObject> contents2 = new HashSet<SomeObject>();
}