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

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

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已经导致生成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生成这些:无论您是否使用注释.注释只是为这些方法添加了getFoo和setFoo别名.如果您需要这些别名,请使用注释,如果不需要,请不要使用.

总结最佳实践:

>不要使用var.>如果必须使用var,则可以(并且应该)避免定义自己的getter和setter.>仅当您使用getFoo和setFoo样式方法签名实现接口时,或者您希望从Java调用代码(其中调用名为foo_ $eq的方法不方便)时,才使用BeanProperty批注.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...