在 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 框架需要 get
和 set
方法。
如果您停留在 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
无论您是否使用注释。注释只是为这些方法添加 getFoo
和 setFoo
别名。如果您需要这些别名,请使用注释,如果不需要,请不要使用。
最佳实践总结:
- 不要使用
var
。
- 如果您必须使用
var
,您可以(并且应该)避免定义自己的 getter 和 setter。
- 仅当您使用
getFoo
和 setFoo
样式的方法签名实现接口时,或者如果您希望代码被调用时,才使用 BeanProperty
注释Java(调用名称如 foo_$eq
的方法不方便)。
在 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 框架需要 get
和 set
方法。
如果您停留在 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
无论您是否使用注释。注释只是为这些方法添加 getFoo
和 setFoo
别名。如果您需要这些别名,请使用注释,如果不需要,请不要使用。
最佳实践总结:
- 不要使用
var
。 - 如果您必须使用
var
,您可以(并且应该)避免定义自己的 getter 和 setter。 - 仅当您使用
getFoo
和setFoo
样式的方法签名实现接口时,或者如果您希望代码被调用时,才使用BeanProperty
注释Java(调用名称如foo_$eq
的方法不方便)。