gpt4 book ai didi

Scala 对象和单例的兴起

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

一般风格问题。

随着我在编写函数式代码方面变得更好,我的更多方法正在变成纯函数。我发现我的许多“类”(在代码容器的松散意义上)正在变得无状态。因此,我将它们设为对象而不是类,因为不需要实例化它们。

现在在 Java 世界中,拥有一个充满“静态”方法的类似乎很奇怪,并且通常只用于“帮助”类,就像你在 Guava 和 Commons-* 等中看到的那样。

所以我的问题是,在 Scala 世界中,“对象”内部有很多逻辑,而不是“类”很正常,或者是否有另一个首选的成语。

最佳答案

正如您在标题中提到的那样,对象是单例类,而不是您在问题文本中提到的具有静态方法的类。

并且有一些东西使 scala 对象比 java-world 中的静态和单例更好,所以在 scala 中使用它们是非常“正常的”。

一方面,与静态方法不同,对象方法是多态的,因此您可以轻松地将对象作为依赖项注入(inject):

scala> trait Quack {def quack="quack"}
defined trait Quack

scala> class Duck extends Quack
defined class Duck

scala> object Quacker extends Quack {override def quack="QUAACK"}
defined module Quacker

// MakeItQuack expects something implementing Quack
scala> def MakeItQuack(q: Quack) = q.quack
MakeItQuack: (q: Quack)java.lang.String

// ...it can be a class
scala> MakeItQuack(new Duck)
res0: java.lang.String = quack

// ...or it can be an object
scala> MakeItQuack(Quacker)
res1: java.lang.String = QUAACK

这使得它们可以在没有紧密耦合和提升全局状态的情况下使用(这是通常归因于静态方法和单例的两个问题)。

然后是他们取消了所有使单例在 java 中如此丑陋和单调的样板。在我看来,这是一个经常被忽视的点,也是使单例在 Java 中如此不受欢迎的部分原因,即使它们是无状态的并且不用作全局状态。

此外,您必须在所有 java 单例中重复的样板文件赋予该类两项职责:确保只有一个自身实例并执行它应该执行的任何操作。 scala 有一种声明方式来指定某物是单例,这一事实使类和程序员免于破坏单一责任原则。在 scala 中,你知道一个对象是一个单例,你可以推断它的作用。

关于Scala 对象和单例的兴起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13646504/

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