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

Is it good practice to use @BeanProperty in Scala instead of defining getter/setter functions?

在 class 中定义可以公开的数据成员 accessed/modified

var _foo: Int = _
def foo_(foo: Int) = _foo = foo    // setter function
def foo = _foo                     // getter function

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

import scala.reflect.BeanProperty
@BeanProperty var foo: Int = _

何时使用此注释,何时不使用?

@BeanProperty 用于 Java 互操作性,特别是 reflection-based Java 框架需要 getset 方法。

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

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

class Foo {
  var foo: Int = _
}

然后javap -private Foo显示如下:

public class Foo {
  private int foo;
  public int foo();
  public void foo_$eq(int);
  public Foo();
}

除非您有需要适合您的 getter 或 setter 的自定义逻辑(在这种情况下,考虑更具描述性的方法名称通常是个好主意,无论如何),您不需要手动定义它们。

scala.reflect.BeanProperty 注释(或 2.11 上的 scala.beans.BeanProperty)对 foo()foo_$eq(int) 方法的生成没有任何影响——编译器将生成这些用于 var foo: Int 无论您是否使用注释。注释只是为这些方法添加 getFoosetFoo 别名。如果您需要这些别名,请使用注释,如果不需要,请不要使用。

最佳实践总结:

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