2010-03-12 7 views
12

Ich habe in letzter Zeit etwas Code von Java in Scala konvertiert, um mir die Sprache beizubringen.

Angenommen, wir diese scala Klasse haben:

class Person() { 
    var name:String = "joebob" 
} 

Jetzt möchte ich Zugang von Java so kann ich nicht Punkt-Notation, wie ich würde, wenn ich war in scala verwenden.

So kann ich meine var den Inhalt erhalten durch Ausgabe:

person = Person.new(); 
System.out.println(person.name()); 

und setzen Sie ihn über:

person = Person.new(); 
person.name_$eq("sallysue"); 
System.out.println(person.name()); 

Dies gilt Ursache unserer Person Klasse wie dies in javap aussieht:

Compiled from "Person.scala" 
public class Person extends java.lang.Object implements scala.ScalaObject{ 
    public Person(); 
    public void name_$eq(java.lang.String); 
    public java.lang.String name(); 
} 

Ja, ich könnte meine eigenen Getter/Setter schreiben, aber ich hasse Klassen füllen damit und es macht nicht viel von Sinn, wenn ich bedenke, dass ich sie schon habe - ich möchte einfach die $ eq-Methode verbessern. (Dies wird tatsächlich schlimmer, wenn Sie mit Sachen wie antlr beschäftigen, denn dann müssen Sie es entkommen und es sieht aus wie person.name _ \ $ eq ("newname");

Hinweis: Ich hätte viel lieber meine Klassen mit mehr Setter-Methoden setzen mit dieser, anstatt füllen

Also, was Sie in dieser Situation tun würde

Antwort

16

Sie Scala Bean-Eigenschaft Annotations verwenden können.?

class Person() { 
    @scala.reflect.BeanProperty 
    var name:String = "joebob" 
} 

das wird erzeugen getName und setName für Sie (nützlich, wenn Sie int benötigen Java-Bibliotheken, die Javabeans erwarten)