Scala - 类是否足够?
Scala - 类是否足够?
来自Java的我对scala的类/对象区分感到困惑。
请注意,我不是在问正式的区别;网络上有足够多的参考资料来解释这个问题,而且SO上也有相关问题。
我的问题是:
- scala设计者为什么选择让事情变得更加复杂(与Java或C#相比)?如果我只声明类而忽略这个区别,有什么劣势吗?
谢谢。
admin 更改状态以发布 2023年5月24日
Scala没有任何关于标准类的静态方法的概念,因此在这些情况下,您将不得不使用对象。这篇有趣的文章提供了一个很好的介绍:
http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3
(向下滚动到Scala的“准静态”)
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){}
,您至少需要一个对象!