Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中使用@BeanProperty而不是定义getter/setter函数是一种好的做法吗?_Scala_Javabeans - Fatal编程技术网

在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和setter
  • 只有在实现带有
    getFoo
    setFoo
    样式的方法签名的接口时,或者如果希望从Java调用代码(在Java中调用名为
    foo_u$eq
    的方法很不方便),才使用
    BeanProperty
    注释

  • 打字错误:应该是
    scala.beans.BeanProperty
    (参见api)不太清楚您为什么说使用
    var
    不是一个好的做法。我们最终通过scala编译器生成getter.setter。为什么认为它不好?谢谢,@OlivierCailloux-我已经找到了答案。@St.Antario避免可变性与
    BeanProperty
    的使用是正交的-无论怎样,在Scala中这都是个好主意。