为什么.size()不是集合上的getSize()

时间:2014-05-23 12:49:39

标签: java api collections

我已经使用Java很长一段时间了,我仍然对这个API的命名感到困惑。为什么会那样?

例如,当您有一个ArrayList实例时,它具有一个属性,即列表中添加了多少对象。要获得此属性,请拨打.size()而不是getSize(),这将更符合您实际尝试的内容。您正在尝试读取此列表的属性值,而不是对其执行某些操作。我猜内部" sizing"这个列表可能要比读取单个变量复杂得多,但这是植入细节,对象的用户不应该关心它。

2 个答案:

答案 0 :(得分:11)

来自"Java Collections API Design FAQ"

的逐字引用
  

为什么不使用“豆式名称”来保持一致性?

     

虽然新收集方法的名称不符合“Beans命名惯例”,但我们认为它们合理,一致且适合其目的。应该记住,Beans命名约定不适用于整个JDK; AWT确实采用了这些惯例,但这个决定有点争议。我们怀疑集合API将被普遍使用,通常在一行代码上进行多次方法调用,因此名称很短很重要。例如,考虑Iterator方法。目前,集合上的循环如下所示:

     

for (Iterator i = c.iterator(); i.hasNext(); ) System.out.println(i.next());

     

即使Collection名称是长表达式,所有内容都整齐地排列在一行上。如果我们将方法命名为“getIterator”,“hasNextElement”和“getNextElement”,则不再是这种情况。因此,我们采用了“传统的”JDK风格而不是Beans风格。

答案 1 :(得分:4)

这种命名的一个可能原因是,在许多情况下,命名是明确的和简洁。想象一下POJO:

public class Human {
    String name;
    //accessors and mutators
}

想象一下有两种方法String name()void name(String)。一个得到名字,另一个得到它。

在这些库类中,大多数名称都是明确的。除了添加或删除元素之外,该类的用户无法设置大小,因此只需size有效;一个人不设置的大小,班级改变'尺寸。其他示例是Map' keySet,它返回一组条目。为地图提供一组密钥而不通过addAll传递地图或逐个添加地图是没有意义的。

其他值得注意的例子包括:

  • String#length。可能不会设置不可变字符串的长度。
  • 更多内容

重要的是要注意像Socket这样的类使用get,set和is等前缀。