Java的“ of”命名约定是什么意思?


75

正如我们在Java 8中看到的那样,有许多名为'of'的方法(如Stream.of()Optional.of())和许多库(如actorOfAkka)。

“ of”是什么意思?是英文单词“ of”还是“ Object Factory”之类的缩写?


顺便说一句,我可以想象对象工厂在适当命名的类或方法中至少显示为“ OF”。
疯狂物理学家

7
我可以在标准Java API中想到的所有示例中,通常的英语含义是“ of”。对于第三方API,请询问作者。(他们可能会因编入首字母缩略词而忽略了大写的标识符约定,而没有适当地大写。)
Stephen C

3
这只是使它听起来像英语的另一半尝试。一个Stream.of(1,2,3)听起来很不错,但一个Optional.of(1)是只是奇怪。actorOf甚至更奇怪,应该被称为createActor
user253751 '18

1
这也是一个简短的单词,在您经常使用时很重要。
托尔比约恩Ravn的安德森

Stream.of(a,b,c)读取:由a,b和c组成
Khaled.K,

Answers:


102

这是一个英文单词,是的。通常将其选择为使表达式读起来像英语短语。例如,Stream.of(3, 4)应该看起来像“三和四的流”,有点像“由数字三和四组成的流”的简化形式。


40

传统上,如果您研究包装器类,它们都包含用于构建给定值类型的包装器类实例的valueOf(XXX)方法。

Integer.valueOf(int)
Double.valueOf(double)
Float.valueOf(float)

Java从第一天开始遵循此命名约定。类似地,大多数Java-8引入的类都of(...)大量包含此方法。

Stream.of(...)
LocalDate.of(year, month, dayOfMonth)
Instant.ofEpochSecond(epochSecond)
and many more.

不仅有valueOfof可用的方法,它有服务于特定的目的或不同类中的任务类型几个方法,他们已经与表示该任务的最合适的名称分配。

  • parseXXX():用于解析给定的字符串输入。示例:Integer.parseInt(str), Double.parseDouble(), Date.parse(datestr)
  • get(field):从对象中检索字段信息。例如:Calendar.get(field), LocalDate.get(TemporalField)
  • format():转换为不同的表示形式。示例:String.format(), SimpleDateFormat.format(), DateTimeFormatter.format()etc

这些命名约定在Java8 DateTime API中大量使用。签出此方法命名约定


31

这是用于静态工厂方法的通用命名约定。

Joshua Bloch在有效Java(第二版)第1项中提到了有关模式和相关命名约定的以下内容:考虑静态工厂方法而不是构造函数(添加了重点):

...(a)静态工厂方法的缺点是它们不易与其他静态方法区分开。它们在API文档中不像构造函数那样突出,因此很难弄清楚如何实例化提供静态工厂方法而不是构造函数的类。Javadoc工具有一天可能会引起人们对静态工厂方法的关注。同时,您可以通过在类或接口注释中吸引对静态工厂的注意,并遵循常见的命名约定来减少此缺点。以下是静态工厂方法的一些常用名称:

  • valueOf—返回一个松散地说,具有与其参数相同值的实例。这种静态工厂实际上是类型转换方法。

  • of—由EnumSet(Item 32)推广的valueOf的一种简洁替代方法。

...

因此,正如其他人指出的那样,“ of”是英语单词“ of”的缩写,不是缩写。但是,使用此约定的原因之一是使查找类是否提供了工厂方法变得更加容易,因为静态工厂没有在JavaDocs的单独部分中显示(与构造方法相比)。

在我看来,使用简洁明了的静态工厂的另一个好处是,它使代码的读法像prose一样,如果它被new构造函数调用所困扰,则不是这种情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.