为什么允许指向构造函数参数?

时间:2009-10-12 14:19:55

标签: scala

此代码

class Foo(str: String) {
    val len = str.length
    def getLen = len
    def getStr = str}

将编译为

public class Foo implements ScalaObject
{

    private final int len;
    private final String str;
    public Foo(String str)
    {
        this.str = str;
        super();
        len = str.length();
    }

    public String getStr()
    {
        return str;
    }

    public int getLen()
    {
        return len();
    }

    public int len()
    {
        return len;
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }
}

但是这段代码

class Foo(str: String) {
    val len = str.length
    def getLen = len
}

将编译为

public class Foo implements ScalaObject
{

    private final int len;

    public Foo(String str)
    {
        len = str.length();
    }

    public int getLen()
    {
        return len();
    }

    public int len()
    {
        return len;
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }
}

为什么Foo课程中没有私人会员?

private final String str;

这是某种优化吗?

为什么允许它指向构造函数的参数。 为什么行“def getStr = str”没有编译时错误?

2 个答案:

答案 0 :(得分:3)

在Scala中,构造函数参数可以从类中的任何位置看到,我更像是“对象参数”。在你的第二个片段中,它没有被编译为为它创建一个类属性,因为你没有在构造函数之外引用它 - 它不是必需的。

答案 1 :(得分:1)

嗯,根据Odersky的书,构造函数是唯一可以将字段与构造函数参数匹配的地方。如果你不这样做,将不会在构造函数外看到变量。