在Scala中使用@BeanProperty而不是定义getter/setter函数是一种好的做法吗?
在可公开访问/修改的类中定义数据成员在Scala中使用@BeanProperty而不是定义getter/setter函数是一种好的做法吗?,scala,javabeans,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 = _ 何时使用此注释
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互操作性,尤其是基于反射的Java框架需要使用get
和set
方法
如果你呆在Scala世界,不要使用它。使用Scala getter(
def foo
)和setter(def foo
)。在第一个示例中有一些冗余,因为定义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();
}
除非你有自定义逻辑,你需要适合你的吸收器或设置器(在这种情况下,通常考虑一个好的方法来考虑更多的描述性方法名称),你不需要手动定义它们。
scala.reflect.BeanProperty
注释(或2.11上的scala.beans.BeanProperty
)对foo()
和foo_u$eq(int)
方法的生成没有任何影响,无论您是否使用注释,编译器都会为var foo:int
生成这些方法。注释只是为这些方法添加了getFoo
和setFoo
别名。如果需要这些别名,请使用注释,如果不需要,请不要使用
总结最佳做法:
var
var
,那么可以(而且应该)避免定义自己的getter和settergetFoo
和setFoo
样式的方法签名的接口时,或者如果希望从Java调用代码(在Java中调用名为foo_u$eq
的方法很不方便),才使用BeanProperty
注释打字错误:应该是
scala.beans.BeanProperty
(参见api)不太清楚您为什么说使用var
不是一个好的做法。我们最终通过scala编译器生成getter.setter。为什么认为它不好?谢谢,@OlivierCailloux-我已经找到了答案。@St.Antario避免可变性与BeanProperty
的使用是正交的-无论怎样,在Scala中这都是个好主意。