这些 TreeSet 声明之间的区别
Difference between these declaration of TreeSet
所以我必须在我的代码中使用 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
选择特定的声明?
正如您所说,这基本上是您允许他人(或您自己)使用的内容。您喜欢与 TreeSet 一起使用的其他方法可能取决于实际声明。所以可能有一个方法需要一个 SortedSet,但是当你将你的 TreeSet 定义为 Set 时,它将无法继续
您应该使用您喜欢的界面进行编程。 但不同之处在于您正在为哪个接口编程。我的意思是,编程到接口(声明类型)而不是实际的 TreeSet
集合。
这是解释 Programming to an interface 的最佳答案。
请不要做出初步决定。如果您不需要 NavigableSet
中的方法,请不要使用它。只需使用 Set<String>
.
作为指导原则,请始终尽可能选择最顶级的类型,因为这样可以更好地从客户端代码中解耦到具体实现。大多数时候,调用代码知道使用了哪个实现并不重要,您只想提供行为而不是公开它。也就是说,有时您会觉得需要更多的控制,那么您应该遍历接口层次结构,直到找到必要的控制级别,但这应该是例外情况,而不是规则
所以我必须在我的代码中使用 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
选择特定的声明?
正如您所说,这基本上是您允许他人(或您自己)使用的内容。您喜欢与 TreeSet 一起使用的其他方法可能取决于实际声明。所以可能有一个方法需要一个 SortedSet,但是当你将你的 TreeSet 定义为 Set 时,它将无法继续
您应该使用您喜欢的界面进行编程。 但不同之处在于您正在为哪个接口编程。我的意思是,编程到接口(声明类型)而不是实际的 TreeSet
集合。
这是解释 Programming to an interface 的最佳答案。
请不要做出初步决定。如果您不需要 NavigableSet
中的方法,请不要使用它。只需使用 Set<String>
.
作为指导原则,请始终尽可能选择最顶级的类型,因为这样可以更好地从客户端代码中解耦到具体实现。大多数时候,调用代码知道使用了哪个实现并不重要,您只想提供行为而不是公开它。也就是说,有时您会觉得需要更多的控制,那么您应该遍历接口层次结构,直到找到必要的控制级别,但这应该是例外情况,而不是规则