正如我们在Java 8中看到的那样,有许多名为'的方法,如Stream.of()
,Optional.of()
,以及Akka中的许多库,如actorOf
。
这是什么""意思?它是英文单词" of"或者像#34; Object Factory"?
这样的缩写答案 0 :(得分:96)
这是一个英文单词,是的。通常选择它使表达式读起来像英语短语。例如,Stream.of(3, 4)
应该看起来像"三和四的流,"这有点像"一个由数字3和4组成的流的缩短版本。"
答案 1 :(得分:35)
传统上,如果你查看包装类,它们都包含valueOf(XXX)
方法来构建给定值类型的包装类的实例。
Integer.valueOf(int)
Double.valueOf(double)
Float.valueOf(float)
Java从第1天开始遵循此命名约定。同样,大多数Java-8引入的类都大量包含此of(...)
方法。
Stream.of(...)
LocalDate.of(year, month, dayOfMonth)
Instant.ofEpochSecond(epochSecond)
and many more.
不仅有valueOf
或of
方法可用,它还有更多的方法可以在不同的类中为特定目的或任务类型提供服务,并且它们已经分配了代表该任务的最合适的名称
Integer.parseInt(str), Double.parseDouble(), Date.parse(datestr)
等Calendar.get(field), LocalDate.get(TemporalField)
等。String.format(), SimpleDateFormat.format(), DateTimeFormatter.format()
等这些命名约定在Java8 DateTime API中得到了充分利用。看看这个Method Naming Conventions
答案 2 :(得分:25)
这是static factory methods使用的常用命名约定。
Joshua Bloch在Effective Java (2nd Edition)中提到了关于模式和相关命名约定的以下内容,第1项:考虑静态工厂方法而不是构造函数(强调添加):
... (a)静态工厂方法的缺点是它们不容易与其他静态方法区分开来。它们在API文档中的表现并不突出 构造函数,所以很难弄清楚如何 实例化一个提供静态工厂方法的类而不是 构造函数。 Javadoc工具有一天可能会引起人们对静态的注意 工厂方法。 与此同时,你可以减少这个劣势 提请注意类或接口注释中的静态工厂, 并遵守通用的命名惯例。这里有一些常见的 静态工厂方法的名称:
valueOf
- 返回一个松散地说与参数值相同的实例。这样的静态工厂是有效的 类型转换方法。
of
- 通过EnumSet推广的valueOf的简明替代方案(第32项)。...
所以,正如其他人所指出的那样,""是指"的英文单词",而不是缩写。但使用此约定的原因之一是,可以更容易地找出类是否提供工厂方法,因为静态工厂不会显示在JavaDocs的单独部分中(与构造函数相比)。
在我看来,使用简洁且具有描述性的静态工厂的另一个好处是它使代码成为read like prose,如果它充满了{{{{}},那么情况并非如此。 1}}构造函数调用。