views:

120

answers:

1

I've been converting some code from java to scala lately trying to teach myself the language.

Suppose we have this scala class:

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

Now I want to access it from java so I can't use dot-notation like I would if I was in scala.

So I can get my var's contents by issuing:

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

and set it via:

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

This holds true cause our Person Class looks like this in javap:

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();
    public int $tag()       throws java.rmi.RemoteException;
}

Yes, I could write my own getters/setters but I hate filling classes up with that and it doesn't make a ton of sense considering I already have them -- I just want to alias the _$eq method better. (This actually gets worse when you are dealing with stuff like antlr because then you have to escape it and it ends up looking like person.name_\$eq("newname");

Note: I'd much rather have to put up with this rather than fill my classes with more setter methods.

So what would you do in this situation?

+8  A: 

You can use Scala's bean property annotation:

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

That will generate getName and setName for you (useful if you need to interact with Java libraries that expect javabeans)

GClaramunt