所以我必须在我的代码中使用TreeSet
。
作为TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable
和interface NavigableSet<E> extends SortedSet<E> which extends Set<E>
我可以使用这三个声明中的任何一个:
NavigableSet<String> myTreeSet= new TreeSet<>();
SortedSet<String> myTreeSet= new TreeSet<>();
Set<String> myTreeSet= new TreeSet<>();
我知道我将只能访问我在声明中使用的接口所暴露的那些方法。是否有其他理由考虑选择TreeSet
的特定声明?
答案 0 :(得分:4)
它基本上是你允许他人(或你自己)使用的,正如你所说的那样。您希望与TreeSet一起使用的其他方法可能取决于实际声明。所以可能有一个方法需要一个SortedSet,但是当你将TreeSet定义为Set时,它将无法继续
答案 1 :(得分:0)
您应该使用您喜欢的任何界面进行编程。 但是,差异 对于您正在编程的界面 。我的意思是,编程到接口(声明类型)而不是实际的TreeSet
集合。
以下是解释Panel
的最佳答案。
答案 2 :(得分:0)
请不要做出初步决定。如果您不需要NavigableSet
的方法,请不要使用它。只需使用Set<String>
。
答案 3 :(得分:0)
作为指导规则,始终选择最可能的顶级类型,因为这允许从客户端代码到具体实现的更大分离。大多数情况下,调用代码知道使用哪个实现并不重要,您只想提供不暴露它的行为。说,有时你会觉得需要更多的控制,然后你应该通过接口层次结构,直到你找到必要的控制级别,但这应该是例外,而不是规则