scala如何对待伴侣对象?

时间:2015-05-29 13:43:57

标签: scala

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

4 个答案:

答案 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)

正如您所指出的,Scala不能拥有Java中已知的静态变量或方法。相反,有单个对象,使用关键字object声明。在这个对象中调用一个方法就像在Java中调用一个静态方法,除了你在一个单例对象上调用该方法。

如果此对象具有classtrait的相同名称,则将其称为类/特征的伴随对象。必须在与类/特征相同的源文件中定义伴随对象。伴随对象与其他对象不同,因为它具有对其他对象不具有的相关类/特征的访问权限。特别是它可以访问类/特征中私有的方法和字段。

答案 3 :(得分:1)

Companion objects为我们提供了一种将功能与类相关联的方法,而无需将其与该类的任何实例相关联。它们通常用于提供其他构造函数