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

时间:2016-01-27 13:41:37

标签: scala javabeans

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

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 = _

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

2 个答案:

答案 0 :(得分:9)

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

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. 仅当您使用BeanPropertygetFoo样式方法签名实施界面时,或者如果您希望自己的代码符合要求时,请使用setFoo注释从Java调用(调用名为foo_$eq的方法很不方便)。

答案 1 :(得分:4)

@BeanProperty用于Java互操作性,尤其适用于期望getset方法的基于反射的Java框架。

如果您留在Scala世界,请不要使用它。使用Scala getter(def foo)和setter(def foo_=)代替。