2009-10-12 6 views
3

Ce codePourquoi est-il permis de pointer vers les paramètres constructeurs?

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

seront compilés à

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); 
    } 
} 

Mais ce code

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

seront compilés à

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); 
    } 
} 

Pourquoi il n'y a pas un privé membre de la classe Foo?

private final String str; 

Est-ce une sorte d'optimisation? Pourquoi est-il permis de pointer vers les paramètres du constructeur?

Pourquoi? Pourquoi il n'y a pas d'erreur de compilation pour la ligne "def getStr = str"?

+0

+1 Ce matin, je me demandais la même chose :-). – helpermethod

Répondre

1

Eh bien, selon le livre d'Odersky, le constructeur est le seul endroit où vous pouvez faire correspondre les champs aux arguments du constructeur. Si vous ne le faites pas, il n'y aura pas de variable vue en dehors du constructeur.

3

Dans Scala, les paramètres du constructeur sont visibles de n'importe où dans la classe, je le vois plutôt comme des "paramètres d'objet". Dans votre deuxième extrait, il n'a pas été compilé pour créer un attribut de classe simplement parce que vous ne le référenciez pas en dehors du constructeur - ce n'est pas nécessaire.

+0

Mais qui devrait gérer la durée de vie des objets qui ont été utilisés comme paramètres constructeurs? –

+0

Je ne suis pas sûr de comprendre la question ... car les objets habituels peuvent être GC'd quand aucune référence n'existe. Votre classe Foo ne gère pas la durée de vie de cet objet (elle a été instanciée ailleurs et qui sait combien de références existent). Les compiles s'assurent simplement de ne pas garder de référence quand cela n'est pas nécessaire. Cela peut ou non en faire un candidat au GC plus tôt, cela dépend de ce qu'on en fait ailleurs. –

Questions connexes