Scala对象和单身人士的兴起
一般风格问题。
当我变得更好地编写功能代码时,我的更多方法正在变成纯粹的功能。我发现很多我的“类”(在一个容器的代码的松散的意义上)正在变得无国界。因此,我将它们作为对象而不是类,因为不需要实例化它们。 现在在Java世界中,有一个充满“静态”方法的类似乎很奇怪,通常只用于“帮助”类,就像你看到的那样,使用Guava和Commons- *等等。 所以我的问题是,在Scala世界中,在“对象”内部有很多逻辑,而不是“类”很正常,或者还有另外一个成语。 解决方法
正如你在标题中提到的,对象是单例类,而不是您在问题文本中提到的具有静态方法的类。
并且有一些事情使得scala对象比java-world中的静态和单例都更好,因此在scala中使用它们是相当“正常的”。 一方面,与静态方法不同,对象方法是多态的,因此可以轻松地将对象注入为依赖关系: 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有一个声明性的方式来指定某事物是一个单身,可以缓解课堂和程序员的破坏单一责任原则。在斯卡拉你知道一个对象是一个单身,你可以只是说明它的作用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |