scala - scala如何对待伴生对象?

标签 scala

我是 Scala 的新手有Java背景。

java当我们想在类的不同对象之间共享任何字段时。我们声明该字段 static .

class Car {
 static NO_Of_TYRES = 4;
 // some implementation.
public int getCarNoOftyres(){
       NO_Of_TYRES; // although it's not a good practice to use static without class name
                    //but we can directly access static member in same class  . 
  }


}

但是在 Scala 中,我们不能在 class 中声明静态字段。 , 我们需要使用 object (伴随对象)为此。
scala我们会这样做,
class Car {
 println(NO_Of_TYRES); // scala doesn't let us do that. gives error 
 println(Car.NO_Of_TYRES);// this is correct way. 

}

object Car {
 val NO_Of_TYRES: Int = 4;
}

我只是好奇,scala如何对待伴生对象?
这两个关键字 (class and object) 有何不同?
为什么 scala 不让我们访问 NO_Of_TYRES直接上课?

最佳答案

伴随对象是单例类实例(和定义),只是记忆一下 java 中的单例或多或少:

class Foo {
    private Foo() { }
    /* boilerplate to prevent cloning */
    private static Foo instance = new Foo();
    public static Foo getInstance() { return instance; }

    public int bar() { return 5; }
}

然后调用这个对象的方法栏:
Foo.getInstance().bar();

Scala 删除了所有这些样板文件,让您只需
object Foo { 
    def bar: Int = 5 
}

并称它为你只需要
Foo.bar

现在“对象”和“伴侣对象”有什么区别?它实际上很简单——伴生对象(因此与类在同一个文件中定义并具有相同名称的对象)可以访问它的相关类私有(private)字段和方法,这可能就是为什么 scala 作者决定它应该驻留在同一个文件 - 以便对私有(private)字段的引用与其声明在同一个文件中(我认为在 Java 和 Scala 中总是如此,除非使用反射魔法)

关于scala - scala如何对待伴生对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531227/

相关文章:

scala - 在 Scala 中是否有更好的替代方案来实现构建器模式?

scala - scala 集合的扁平化是否保持秩序?

json - 使用Shapeless HList轻松构建Json Decoder

scala - 无法使用 spark-sftp api 将数据帧写入目标 sftp 服务器

scala - Future 的 OnSuccess 调用中变量的范围发生了变化

scala - 通用模板库

scala - Scala中抽象类型参数的隐式转换

Scala:使用隐式证据的通用方法无法编译

scala - 行为上的意外差异似乎是由于使用 private[this] 而不是 private

java - 是否有任何可证明的现实世界语言? (斯卡拉?)