gpt4 book ai didi

Scala toString : parenthesize or not?

转载 作者:行者123 更新时间:2023-12-03 11:51:16 25 4
gpt4 key购买 nike

我希望这个线程成为覆盖和调用 toString 的优点/缺点的某种总结。有或没有空括号,因为这件事有时仍然让我感到困惑,即使我已经进入 Scala 很长一段时间了。

那么哪一个比另一个更可取呢?来自 Scala 极客、官员和强制症偏执狂的评论受到高度赞赏。
toString 的优点:

  • 乍一看似乎是一个明显而自然的选择;
  • 大多数情况都是微不足道的,只是在不修改内部状态的情况下即时构造字符串;
  • 另一个常见的情况是将方法调用委托(delegate)给包装的抽象:
    override def toString = underlying.toString
  • toString() 的优点:
  • 绝对不是“类似访问器”的名称(这就是 IntelliJ IDEA 检查员不时提示的方式);
  • 可能意味着一些 CPU 或 I/O 工作(在计算每个 System.arrayCopy 调用对性能至关重要的情况下);
  • 甚至可能意味着一些可变的状态改变(考虑一个例子,当第一个 toString 调用很昂贵,所以它被内部缓存以在将来产生更快的调用)。

  • 那么最佳实践是什么?我还缺少什么吗?

    更新:这个问题专门与 toString 相关。这是在每个 JVM 对象上定义的,所以我希望找到最佳实践,如果它存在的话。

    最佳答案

    以下是 Scala 编程(第 10.3 节)必须说的内容:

    The recommended convention is to use a parameterless method whenever there are no parameters and the method accesses mutable state only by reading fields of the containing object (in particular, it does not change mutable state). This convention supports the uniform access principle,1 which says that client code should not be affected by a decision to implement an attribute as a field or method.



    以下是(非官方)Scala 风格指南(第 18 页)所说的:

    Scala allows the omission of parentheses on methods of arity-0 (no arguments):


    reply() 
    // is the same as
    reply

    However, this syntax should only be used when the method in question has no side-effects (purely-functional). In other words, it would be acceptable to omit parentheses when calling queue.size, but not when calling println(). This convention mirrors the method declaration convention given above.



    后者没有提到统一访问原则。

    如果您的 toString方法可以实现为 val ,这意味着该字段是不可变的。然而,如果你的类是可变的, toString可能并不总是产生相同的结果(例如 StringBuffer )。所以在 Scala 中编程意味着我们应该使用 toString()两个 不同的情况:

    1)当它的值是可变的

    2) 有副作用时

    就我个人而言,我认为忽略其中的第一个更为常见和一致。在实践中 toString几乎不会有副作用。所以(除非确实如此),请始终使用 toString并忽略统一访问原则(遵循样式指南):保留括号以表示副作用,而不是可变性。

    关于Scala toString : parenthesize or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8124055/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com