mon*_*ack 20 functional-programming scala
一般风格的问题.
随着我在编写功能代码方面变得更好,我的更多方法正在成为纯函数.我发现很多我的"类"(松散意义上的代码容器)正在变得无国家.因此,我将它们设为对象而不是类,因为不需要实例化它们.
现在在Java世界中,拥有一个充满"静态"方法的类似乎很奇怪,并且通常只用于"帮助"类,就像你在Guava和Commons-*中看到的那样.
所以我的问题是,在Scala世界中,"对象"内部有很多逻辑而不是"类"非常正常,或者是否存在另一个首选成语.
Pao*_*lla 16
正如您在标题中提到的,对象是单例类,而不是您在问题文本中提到的具有静态方法的类.
并且有一些东西使得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
Run Code Online (Sandbox Code Playgroud)
这使得它们可以在没有紧耦合的情况下使用,并且不会促进全局状态(这是通常归因于静态方法和单例的两个问题).
然后就是这样一个事实,即他们不再使用所有的模板,这使得单身人士在java中看起来如此丑陋和单一.在我看来,这是一个经常被忽视的观点,也是使单身人士在java中如此不受欢迎的部分原因,即使他们是无国籍人并且没有被用作全球国家.
此外,您必须在所有Java单例中重复的样板文件赋予类两个职责:确保只有一个自身实例并执行它应该做的任何事情.事实上,scala具有指定某个东西是单例的声明方式,这使得类和程序员不再违反单一责任原则.在scala中,你知道一个对象是一个单例,你可以推断它的作用.
归档时间: |
|
查看次数: |
2640 次 |
最近记录: |