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

封装:为什么要使用java中的名称keySet,java,dictionary,encapsulation,Java,Dictionary,Encapsulation,在java中,要获取映射中的所有键,我们可以使用keySet方法。但是我想知道为什么方法名不仅仅是键?名称集不是泄露了实现的详细信息吗 据我所知,Java是静态类型语言,在名称中包含类型毫无意义。无论如何,调用代码必须具有正确的接口类型。如果我们假设这个策略是正确的,那么每个方法都必须在前面加上类型,这毫无意义。我认为@JBNizet在他的评论中正确地指出了这一选择背后的原因 名称集不是泄露了实现的详细信息吗 1套是一个接口。 例如,如果将该方法命名为keyHashSet,这将不是一个好主意 因

在java中,要获取映射中的所有键,我们可以使用keySet方法。但是我想知道为什么方法名不仅仅是键?名称集不是泄露了实现的详细信息吗


据我所知,Java是静态类型语言,在名称中包含类型毫无意义。无论如何,调用代码必须具有正确的接口类型。如果我们假设这个策略是正确的,那么每个方法都必须在前面加上类型,这毫无意义。我认为@JBNizet在他的评论中正确地指出了这一选择背后的原因

名称集不是泄露了实现的详细信息吗

1套是一个接口。 例如,如果将该方法命名为keyHashSet,这将不是一个好主意 因为HashSet是Set的一个实现

但是keySet很好,因为将定义特定约定的接口作为返回类型,并在方法名称中使用传达该特定约定的名称,是按接口编程的有效方法,并且能够以干净的方式返回Set的任何实现

2除了在映射界面中选择键方法名称而不是键集之外,也不可能。 正如@JB Nizet在其注释中所建议的,已经在JDK集合类中定义了一个keys方法:枚举键。 它在哈希表继承自的Dictionary类中声明:

public class Hashtable<K,V>  extends Dictionary<K,V>...{
必须实现一种方法以枚举形式返回键,但也必须实现另一种方法以集合形式返回键。 因此需要一个独特的命名来区分它们

您可能还注意到,在映射接口中定义的Set entrySet遵循相同的命名逻辑,而HashTable的其他层次结构没有定义entries方法。 这可能是一致的

名称集不是泄露了实现的详细信息吗

声明集键集没有告诉我们更多关于 实现比设置键更简单。在这两种情况下,我们都知道该方法返回一个集合。Set是一个接口,而不是一个具体的类

在名称中包含这一点是否是一个好主意,就个人而言是一个风格问题,不,我不认为是;但理性的人可能会有所不同。但是这样做并不能告诉我们任何我们不知道的关于实现的信息

我想知道为什么方法名不仅仅是键

就像现代Java中的许多东西一样,向后兼容性也有点阻碍:键已经被占用了,这个类应该仍然能够实现Map,所以他们必须选择其他东西

名称集不泄漏有关实现的详细信息吗


不,没有。映射接口已经指定不能有重复的键。因此,键的集合是一组定义。Set仍然是一个接口,可以有不同的实现。

因为它返回Set,也因为旧哈希表已经有一个名为keys的方法返回枚举。因此,新方法返回一个集合时必须使用另一个名称。@JBNizet我认为您的答案是正确的,这不是出于选择。这不是正确的答案。正如其他人提到的,keySet不会破坏任何封装。我只是认为,如果可能的话,他们可能会像选择价值观那样选择关键点。同样,这是一个偏好和品味的问题。在方法名称中包含类型本身并不坏。它可以提供有关该方法的有意义的信息,特别是在使用自动完成时。它还可以帮助消除方法之间的歧义,例如,在数字中使用intValue、longValue、doubleValue。通常,类型也是指定方法返回内容的最精确名称。例如,想想Path.getFileSystem.Java是静态类型语言,在名称中包含类型是没有意义的。无论如何,调用代码必须具有正确的接口类型。@CodeYogi:名称只是因为键已经被取了。@Thilo是的,这是正确的答案,如果在键和键集之间进行选择,第一个更好,对吗?是的。但另一个也不是超级可怕。当然,它并没有规定一个特定的实现,而这正是问题最关心的。还不如对keySet vs getKeySet大发脾气。或者,名称和类型都不能清楚地表明返回的集是一个视图,而不是快照,或者它是否是可变的。@Thilo:Heh,说得好。名字的固定部分并不是最大的问题-
public class Hashtable<K,V>  extends Dictionary<K,V>  implements Map<K,V>,