2017-03-17 3 views
0

Umzug von Groovy nach Scala und bisher Scala lieben. Eines der Dinge, die ich an Groovy zutiefst vermisse, ist die Tatsache, dass ich Eigenschaften/Felder für Objekte definieren und sie dann ohne Getter aus anderen Klassen referenzieren kann.Zugriff auf Scala-Felder ohne Getter

Zum Beispiel in Java:

public class Fizz { 
    private String buzz; 

    public Fizz(String buzz) { 
     super(); 

     setBuzz(buzz); 
    } 

    // Getters and setters for buzz 
} 

Aber in Groovy:

class Fizz { 
    String buzz 
} 

Dann könnte ich buzz aus einer anderen Klasse verweisen etwa so:

void someMethod(Fizz fizz) { 
    if(fizz.buzz == "gnarly!") { 
     ... 
    } 
} 

aber es scheint, dass Scala sich nicht so verhält, und du musst dich damit begnügen:

class Fizz(buzz : String) { 
    ... 
} 

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.getBuzz.eq("gnarly!")) { 
    ... 
    } 
} 

Zu meiner Scala-Code „grooviger“ (für diesen einen Anwendungsfall) machen Ich habe in einige meiner Scala Klassen über das Hinzufügen von „Helfer“ Methoden angesiedelt:

class Fizz(buzz : String) { 
    def buzz() : String = { this.buzz } 
} 

Welche ermöglicht jetzt mich auf sie zuzugreifen, wie so:

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.buzz.eq("gnarly!")) { 
    ... 
    } 
} 

Meine Frage: Does Scala irgendwelche anderen Mechanismen/Geräte, die mir erlauben, die oben gewünschte Verhalten zu erreichen withou Ich muss meine sogenannten "Helfer-Methoden" schreiben?

+1

Bitte lesen Sie über die Fallklassen in Scala –

+0

Nicht sicher, warum dies abgelehnt wurde. Dies ist Thema, ist kein Betrogener (angesichts der Tatsache, dass ich Scala natürlich neu bin und vielleicht nicht über Dinge wie Fallklassen oder andere Konstrukte, die auf dieser Seite bereits angefragt wurden, weiß), zeigt Forschung und ist ein [ SSCCE] (http://sscce.org). – smeeb

Antwort

3

Eigentlich tut es das. Schauen Sie sich dieses nice Beispiel an. Abhängig davon, wie Sie den Parameter im primären Konstruktor deklarieren, erhalten Sie das folgende Verhalten:

Deklaration Getter? Setter?
----------- ------- -------
var ja ja
val ja nein
Standard nein nein

Hier default bedeutet, dass Sie den Klassenparameter entweder val oder var deklarieren, wie Sie es tatsächlich tun. Wenn Sie also val davor setzen, erhalten Sie den öffentlichen Zugang zum Feld out of the box.

Ich hoffe, das ist hilfreich.

+0

Danke @Bianca Tesila, aber verlangt das nicht immer noch, dass ich die Feldreferenz mit "get" voranstelle? Also 'fizz.getBuzz'? Ich suche nach einer Möglichkeit, 'fizz.buzz' zu schreiben. – smeeb

+0

Nein, wenn Sie 'fizz.buzz' aufrufen, rufen Sie tatsächlich den intern erstellten Getter auf. Sie brauchen also nichts dazu. Sie können überprüfen, was mit javap tool erzeugt wird. –

Verwandte Themen