在Scala中使用@BeanProperty而不是定义getter/setter函数是一种好习惯吗?

Fah*_*qui 5 scala javabeans

在可以公开访问/修改的类中定义数据成员

var _foo: Int = _
def foo_(foo: Int) = _foo = foo    // setter function
def foo = _foo                     // getter function
Run Code Online (Sandbox Code Playgroud)

使用注释转换它是一个好习惯@BeanProperty吗?

import scala.reflect.BeanProperty
@BeanProperty var foo: Int = _
Run Code Online (Sandbox Code Playgroud)

何时使用此注释以及何时不使用?

Tra*_*own 9

您的第一个示例中存在一些冗余,因为定义var已经导致生成getter和setter.例如,如果我们编译这个类:

class Foo {
  var foo: Int = _
}
Run Code Online (Sandbox Code Playgroud)

然后javap -private Foo显示以下内容:

public class Foo {
  private int foo;
  public int foo();
  public void foo_$eq(int);
  public Foo();
}
Run Code Online (Sandbox Code Playgroud)

除非你有自定义逻辑,你需要适应你的getter或setter(在这种情况下,通常最好考虑更多的描述性方法名称),你不应该手动定义它们.

scala.reflect.BeanProperty注释(或scala.beans.BeanProperty2.11)不会对产生任何影响foo()foo_$eq(int)方法,编译器会生成这些对var foo: Int您是否使用注释.注释只是为这些方法添加getFoosetFoo别名.如果您需要这些别名,请使用注释,如果不需要,请不要使用.

总结最佳实践:

  1. 不要用var.
  2. 如果必须使用var,您可以(并且应该)避免定义自己的getter和setter.
  3. BeanProperty仅当您使用getFoosetFoo-style方法签名实现接口时,或者如果您希望从Java调用代码(其中调用名称类似的foo_$eq方法不方便)时,请使用注释.


sjr*_*jrd 6

@BeanProperty旨在实现 Java 互操作性,特别是与基于反射的 Java 框架期望getset方法的互操作性。

如果您还停留在 Scala 世界中,请不要使用它。请改用 Scala getters ( def foo) 和 setters ( def foo_=) 。