Как псевдоним метода установки scala 'myvar_ $ eq (myval)' для чего-то более приятного в Java? - PullRequest
13 голосов
/ 12 марта 2010

В последнее время я конвертировал некоторый код из Java в Scala, пытаясь научить себя языку.

Предположим, у нас есть класс scala:

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

Теперь я хочу получить к нему доступ из Java , поэтому я не могу использовать точечные обозначения, как если бы я был в Scala.

Так что я могу получить содержимое моего var, набрав:

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

и установите его с помощью:

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

Это верно, потому что наш класс Person выглядит следующим образом в 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();
}

Да, я мог бы написать свои собственные методы получения / установки, но я ненавижу заполнять классы этим, и это не имеет большого смысла, учитывая, что они у меня уже есть - я просто хочу лучше псевдоним метода _ $ eq. (Это на самом деле ухудшается, когда вы имеете дело с такими вещами, как antlr, потому что тогда вам нужно избегать этого, и в итоге это выглядит как person.name _ \ $ eq ("newname");

Примечание: я бы предпочел смириться с этим, а не заполнять свои классы более сеттерными методами.

Так что бы вы сделали в этой ситуации?

1 Ответ

17 голосов
/ 12 марта 2010

Вы можете использовать аннотацию свойства бобов Scala:

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

Это сгенерирует для вас getName и setName (полезно, если вам нужно взаимодействовать с библиотеками Java, которые ожидают JavaScript)

...