我是Java背景的Scala
的新手。
在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
?
答案 0 :(得分:3)
伴随对象是单例类实例(和定义),只是为了在java中调用单例或多或少:
possible ways
然后调用此对象的方法栏:
<userControls:MyUserControl x:Name="MyUserControl1"/>
<Label Content="{Binding ElementName=MyUserControl1, Path=SelectedA.Title}" />
Scala删除了所有这些样板文件,让你只用
创建相同的东西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作者决定它应该驻留在同一个类中的原因。 file - 所以对私有字段的引用与它们的声明在同一个文件中(我认为在Java和Scala中都是如此,除非使用反射魔法)
答案 1 :(得分:2)
我想引用关于同一主题的另一个答案:What are the advantages of Scala's companion objects vs static methods?
另见Odersky的书Programming in Scala - Chapter 4 - Classes and Objects
的第4.3节 Scala将所有内容视为其实例的纯对象。在这个视图中,java static
成员不是任何实例的一部分,它只是一个独立的生活。
使用关键字object
的技巧和一些语法糖,您可以实现相同的结果,但保持规定的原则:实例化该对象的单个实例,并提供该实例的全局访问点。
答案 2 :(得分:1)
object
声明。在这个对象中调用一个方法就像在Java中调用一个静态方法,除了你在一个单例对象上调用该方法。
如果此对象具有class
或trait
的相同名称,则将其称为类/特征的伴随对象。必须在与类/特征相同的源文件中定义伴随对象。伴随对象与其他对象不同,因为它具有对其他对象不具有的相关类/特征的访问权限。特别是它可以访问类/特征中私有的方法和字段。
答案 3 :(得分:1)
Companion objects
为我们提供了一种将功能与类相关联的方法,而无需将其与该类的任何实例相关联。它们通常用于提供其他构造函数