Почему разрешено указывать на параметры конструкторов? - PullRequest
3 голосов
/ 12 октября 2009

Этот код

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 ]

3 голосов
/ 12 октября 2009

В Scala параметры конструктора видны из любого места в классе, я вижу это больше как «параметры объекта». В вашем втором фрагменте он не был скомпилирован для создания атрибута класса для него просто потому, что вы не ссылаетесь на него вне конструктора - он не нужен.

1 голос
/ 12 октября 2009

Ну, согласно книге Одерского, конструктор - это единственное место, где вы можете сопоставить поля с аргументами конструктора. Если вы этого не сделаете, за пределами конструктора не будет видно ни одной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...