我是 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/