2015-05-29 101 views
4

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

我只是好奇,怎么对待阶同伴对象? 这两个关键词(class and object)是什么不同造成的? 为什么scala不让我们直接在课堂上访问NO_Of_TYRES

+3

您可以在文件级别或类内部导入Car._'并根据我的知识使用'NO_OF_TYRES' – Daenyth

+0

,Companaion对象必须位于同一个文件中?仍然需要导入我不这么认为?我的问题是,scala如何处理关键字类和对象? –

+1

它需要在同一个文件中。 – Daenyth

回答

2

我想引用关于同一主题的另一个答案:What are the advantages of Scala's companion objects vs static methods?

第4.3节 Odersky的书Programming in Scala - Chapter 4 - Classes and Objects

斯卡拉把一切与他们的实例纯对象见。在这个视图中,一个java static成员不是任何实例的一部分,它生活在一个单独的,不同的生活中。

利用关键字object和某些语法糖的技巧,可以实现相同的结果,但保持所述的原则:实例化该对象的单个实例并提供该实例的全局访问点。

+0

谢谢。您提供的链接真的很有帮助。 –

3

播对象是单例类实例(和定义),只是为了单记得在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(); 

斯卡拉删除所有这样的样板,并让你创建等同的东西只是

object Foo { 
    def bar: Int = 5 
} 

并称之为你只需要

Foo.bar 

现在'object'和'companion object'有什么区别?它实际上非常简单 - 伴侣对象(所以对象在同一个文件中定义为一个类,并且具有相同的名称)可以访问它的相关类专用字段和方法,这就是为什么scala作者决定它应该驻留在同一个文件中文件 - 所以对私有字段的引用与它们的声明位于同一个文件中(除非使用反射魔法,否则我认为它始终是Java和Scala中的情况)

+4

最重要的原因是您可以随时向系统添加新代码。如果您允许在* * *编译单元中添加新的伴随对象,则任何人都可以添加新的伴随对象并通过访问其私有对象来破坏类的封装。两个同伴都在同一个编译单元中的要求确保了封装被保留。换句话说,如果你有权访问类的源文件,无论如何封装都不在窗口中。 –

+0

感谢您的帮助。 –

1

正如您所指出的,Scala不能具有静态变量或Java中已知的方法。相反,有单身人士对象,这些对象是用关键字object声明的。在这个对象中调用一个方法就像在Java中调用一个静态方法,不同的是你调用单例对象的方法。

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

+0

感谢您的帮助。 –

相关问题