封装:为什么在java中使用名称keySet

时间:2017-10-01 09:54:42

标签: java dictionary encapsulation

在java中获取地图中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是keys?名称Set是否泄漏了有关实施的详细信息?

根据我的理解,Java是静态类型语言,并且名称中的类型根本没有意义。调用代码无论如何都必须具有正确的接口类型。如果我们假设这个策略是正确的,那么每个方法都必须有类型的前缀,这些类型没有任何意义。我认为@JBNizet在评论中正确地说明了选择背后的原因。

3 个答案:

答案 0 :(得分:4)

  

是不是名称Set泄漏了有关实现的详细信息?

1)Set是一个界面 例如,如果方法名为keyHashSet(),则不是一个好主意 由于HashSetSet的实现。

但是keySet()很好,因为将返回类型作为定义特定合同的接口并使用在方法名称中传达此特定合同的名称是一种通过接口编程并能够返回的有效方式以干净的方式执行Set

2)除了在Map界面中选择keys()方法名称而不是keySet()之外,也不可能。{
正如@JB Nizet在其评论中所建议的那样,JDK集合类中已经定义了keys()方法:Enumeration<K> keys()
它在Dictionary类中声明HashTable继承自:

public class Hashtable<K,V>  extends Dictionary<K,V>...{

但是这种方法:Enumeration<K> keys();没有返回Set 所以HashTable既是Dictionary又是Map

public class Hashtable<K,V>  extends Dictionary<K,V>  implements Map<K,V>,

必须实现一种方法以Enumeration形式返回密钥,而另一种方法则以Set形式返回密钥。
需要一个独特的命名来区分它们

您可能还注意到,Set<Map.Entry<K, V>> entrySet()界面中定义的Map遵循相同的命名逻辑,而HashTable的其他层次结构未定义entries()方法。
它可能是一致的。

答案 1 :(得分:3)

  

名称Set是否泄漏了有关实施的详细信息?

声明Set<K> keySet()并没有告诉我们更多关于此事的信息 实施Set<K> keys()更好。在这两种情况下,我们都知道该方法返回SetSet是一个接口,而不是具体的类。

在名称中包含它是一个好主意是一个风格问题(个人,不,我不认为它;但合理的人可以有所不同)。但这样做并没有告诉我们关于实现的任何信息,无论如何我们都不知道。

答案 2 :(得分:3)

  

我想知道为什么方法名称不只是keys

与现代Java中的许多内容一样,向后兼容性略有不同:keys()已被采用(java.util.Hashtable.keys(),并且该类仍应能够实现Map ),所以他们不得不选择别的东西。

  

名称Set是否泄漏了有关实现的详细信息?

不,它没有。 Map接口已指定不能有重复的键。因此,根据定义,密钥集合是SetSet仍然是一个可以有不同实现的接口。