首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在scala中作为类成员初始化?

如何在scala中作为类成员初始化?
EN

Stack Overflow用户
提问于 2019-02-18 14:49:48
回答 3查看 84关注 0票数 0

我有一个随机数类,它生成随机的number.However,我希望它作为类成员被初始化,这样我们就不需要在每个call.Below中重新生成,这是目前的代码。

代码语言:javascript
复制
import ml.combust.mleap.core.Model
import ml.combust.mleap.core.types._

case class RandomNumberModel() extends Model{

  def apply(input: String):  Double  = {
    val rnd = scala.util.Random
    return rnd.nextFloat
  }

  override def inputSchema: StructType = StructType("input" -> ScalarType.String).get

  override def outputSchema: StructType = StructType("output" -> ScalarType.Double ).get

}

我是scala新手,需要建议我在这里需要做哪些更改?

EN

回答 3

Stack Overflow用户

发布于 2019-02-18 15:48:35

试一试

代码语言:javascript
复制
case class RandomNumberModel() extends Model {
  private val rnd = scala.util.Random

  def apply(input: String): Double = rnd.nextFloat

  override def inputSchema: StructType = StructType("input" -> ScalarType.String).get

  override def outputSchema: StructType = StructType("output" -> ScalarType.Double ).get

}
票数 3
EN

Stack Overflow用户

发布于 2019-02-18 17:05:21

这主要是对你自己答案的回应,但不适合评论。

与使用var _instancedef instance相比,

  1. Scala有一个内置的、线程安全的替代方案:lazy val。使用它,我们可以得到

对象inst { // private在伴生类private lazy val RandomNumberModel : RandomNumberModel.instance

  • Since = scala.util.Random }中仍然可见//在类: val RandomNumberModel=scala.util.Random中,当你使用RandomNumberModel时,你总是需要初始化实例,在这种情况下,你实际上没有从lazy中获得任何好处,只有一些小的开销。伴生对象中的非惰性val只有在装入类时才会被初始化,例如,当您创建类的第一个实例时。所以private val instance : Random = scala.util.Random.

  • You不需要存储总是指向类中相同实例的引用,这只会浪费内存。最好直接使用RandomNumberModel.instance

案例类RandomNumberModel()扩展模型{ def apply(input: String):Double ={ RandomNumberModel.instance.nextFloat //为什么不使用nextDouble?} ... }

  • 您有多个模型使用相同的Random。如果您的程序曾经有多个线程操作模型,请注意

Instances of java.util.Random are threadsafe. However, the concurrent use of the same java.util.Random instance across threads may encounter contention and consequent poor performance.

如果您使用ThreadLocalRandom,它会自动处理初始化:

case类RandomNumberModel()扩展模型{ def apply(input: String):Double ={ ThreadLocalRandom.current.nextFloat } ... } //对象RandomNumberModel消失了

  1. 是否希望所有RandomNumberModel%s都相等?如果不是,就不要把它设为case class.
票数 1
EN

Stack Overflow用户

发布于 2019-02-18 16:21:25

我尝试了如下,这是否可以正常工作,或者我在这里做错了什么:

代码语言:javascript
复制
case class RandomNumberModel() extends Model{
    import RandomNumberModel._
    val inst = instance()

    def apply(input: String):  Double  = {
        inst.nextFloat
    }

    override def inputSchema: StructType = StructType("input" -> ScalarType.String).get

    override def outputSchema: StructType = StructType("output" -> ScalarType.Double ).get
}

object RandomNumberModel {
  private var _instance : Random = null
  def instance() = {
    if (_instance == null)
      _instance = scala.util.Random
    _instance
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54741820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档