我如何将scala setter方法'myvar_ $ eq(myval)'别名为在java中更令人满意的东西?

eyb*_*erg 13 java setter scala javap scalac

我最近将一些代码从java转换为scala,试图自学语言.

假设我们有这个scala类:

class Person() {
  var name:String = "joebob"
}
Run Code Online (Sandbox Code Playgroud)

现在我想从java访问它,所以我不能像我在scala那样使用点符号.

所以我可以通过发出以下内容来获取我的var的内容:

person = Person.new();
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

并通过以下方式设置:

person = Person.new();
person.name_$eq("sallysue");
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为我们的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();
}
Run Code Online (Sandbox Code Playgroud)

是的,我可以编写自己的getter/setter但是我讨厌用这个来填充类,考虑到我已经拥有它们并没有多大意义 - 我只想更好地为_ $ eq方法添加别名.(当你处理像antlr这样的东西时,这实际上会变得更糟,因为那时你必须逃避它,它最终看起来像person.name _\$ eq("newname");

注意:我宁愿忍受这个,而不是用更多的setter方法填充我的类.

那么在这种情况下你会做什么?

GCl*_*unt 17

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

class Person() {
  @scala.reflect.BeanProperty
  var name:String = "joebob"
}
Run Code Online (Sandbox Code Playgroud)

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