13

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

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?

4

1 回答 1

17

您可以使用 Scala 的 bean 属性注释:

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

这将为您生成 getName 和 setName(如果您需要与期望 javabean 的 Java 库进行交互,这很有用)

于 2010-03-12T19:22:19.090 回答