Scala - 类是否足够?

15 浏览
0 Comments

Scala - 类是否足够?

来自Java的我对scala的类/对象区分感到困惑。

请注意,我不是在问正式的区别;网络上有足够多的参考资料来解释这个问题,而且SO上也有相关问题。

我的问题是:

  1. scala设计者为什么选择让事情变得更加复杂(与Java或C#相比)?如果我只声明类而忽略这个区别,有什么劣势吗?

谢谢。

admin 更改状态以发布 2023年5月24日
0
0 Comments

Scala没有任何关于标准类的静态方法的概念,因此在这些情况下,您将不得不使用对象。这篇有趣的文章提供了一个很好的介绍:

http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3

(向下滚动到Scala的“准静态”)

0
0 Comments

Java类包含两种完全不同类型的成员--实例成员(如BigDecimal.plus)和静态成员(如BigDecimal.valueOf)。在Scala中,只有实例成员。这实际上是一种简化!但它留下了一个问题:我们该把像valueOf这样的方法放在哪里?这就是对象有用的地方。

class BigDecimal(value: String) {
   def plus(that: BigDecimal): BigDecimal = // ...
}
object BigDecimal {
   def valueOf(i: Int): BigDecimal = // ...
}


您可以将其视为匿名类的声明和其单个实例化:

class BigDecimal$object {
   def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object


在阅读Scala代码时,区分类型和值非常重要。我已经配置了IntelliJ来突出显示类型。

val ls = List.empty[Int]  // List is a value, a reference the the object List
ls: List[Int]             // List is a type, a reference to class List


Java还有另一个复杂度级别,在Scala中被删除--字段和方法之间的区别。接口上不允许出现字段,除非它们是静态的和最终的;方法可以被重写,而字段则被隐藏(如果在子类中重新定义)。Scala消除了这种复杂性,只向程序员公开方法。

最后,对于您的第二个问题一个轻率的答案:如果您不声明任何对象,您的程序可能永远不会运行,因为要定义Scala中等效的public static void main(String...args){},您至少需要一个对象!

0