【问题标题】:What does the naming convention 'of' mean in Java?Java中的命名约定“of”是什么意思?
【发布时间】:2018-01-15 02:35:48
【问题描述】:

正如我们在 Java 8 中看到的那样,在 Akka 中有许多名为“of”的方法,例如 Stream.of()Optional.of(),以及许多库,例如 actorOf

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

【问题讨论】:

  • 顺便说一句,我想对象工厂至少在正确命名的类或方法中显示为“OF”。
  • 在我能想到的标准 Java API 中的所有示例中,它的意思是正常英语意义上的“of”。对于第 3 方 API,请询问作者。 (他们可能通过编造首字母缩写词而不正确大写来故意忽略标识符约定。)
  • 这只是让它听起来像英语的又一次半途而废的尝试。 Stream.of(1,2,3) 听起来不错,但 Optional.of(1) 很奇怪。 actorOf 更奇怪,应该叫createActor
  • 也是一个简短的词,当你经常使用它时很重要。
  • Stream.of(a,b,c) 读取:一个 stream 包含 of a、b 和 c。

标签: java


【解决方案1】:

这是一个英文单词,是的。通常选择它以使表达式读起来像英语短语。例如,Stream.of(3, 4) 应该看起来像“3 和 4 的流”,有点像“由数字 3 和 4 组成的流”的缩短版本。

【讨论】:

    【解决方案2】:

    按照传统,如果您查看包装类,它们都包含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()

    这些命名约定在 Java8 DateTime API 中被大量使用。看看这个Method Naming Conventions

    【讨论】:

      【解决方案3】:

      这是用于static factory methods 的通用命名约定。

      Joshua Bloch 在 Effective Java (2nd Edition) 第 1 项中提到了以下关于模式和相关命名约定的内容:考虑静态工厂方法而不是构造函数(强调添加):

      ... (a) 静态工厂方法的缺点是它们不容易与其他静态方法区分开来。它们在 API 文档中并不突出 构造函数,所以很难弄清楚如何 实例化一个提供静态工厂方法的类,而不是 构造函数。 Javadoc 工具有朝一日可能会引起对静态的关注 工厂方法。 与此同时,您可以通过以下方式减少此劣势 提请注意类或接口 cmets 中的静态工厂, 并遵守常见的命名约定。这里有一些常见的 静态工厂方法的名称:

      • valueOf - 返回一个实例,该实例的值大致与其参数相同。这样的静态工厂是有效的 类型转换方法。

      • of——valueOf 的简洁替代方案,由 EnumSet 推广(第 32 项)。

      ...

      因此,正如其他人指出的那样,“of”表示英文单词“of”,而不是缩写。但是使用这种约定的原因之一是更容易发现一个类是否提供了工厂方法,因为静态工厂不会显示在 JavaDocs 的单独部分中(与构造函数相比)。

      在我看来,使用简洁明了的静态工厂命名的另一个好处是,它可以生成代码read like prose,而如果它充斥着new 构造函数调用,则情况并非如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        相关资源
        最近更新 更多