0
votes

Comment initier comme membre de classe à Scala?

J'ai une classe de nombres aléatoires générant le nombre aléatoire.Ce ce que je veux qu'il soit initié en tant que membre de classe afin de ne pas avoir besoin de régénérer dans chaque appel.below est le code à présent.

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

}


0 commentaires

3 Réponses :


3
votes

Essayez xxx


1 commentaires

Remarque: Si un modèle peut être utilisé simultanément, considérez docs.oracle.com/javase/7/docs/api/java/util/concurrent/... .



0
votes

J'ai essayé comme ci-dessous cela fonctionnera bien ou ici, je fais quelque chose de mal:

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 commentaires

1
votes

Ceci est principalement une réponse à votre propre réponse, mais ne correspond pas dans un commentaire.

  1. Scala a une alternative intégrée et sans sécurité à ce que vous faites avec var _Instance et instance : . En utilisant nous obtenons XXX

  2. Puisque vous avez toujours besoin d'initialiser l'instance lorsque vous utilisez aléatoireNumbermodel , vous n'obtenez aucun avantage de paresseux pour ce cas, seulement un peu mineur aérien. Non paresseux val S sur l'objet compagnon ne sont initialisés que lorsque la classe est chargée, par exemple. lorsque vous créez la première instance de la classe. Donc, il suffit de faire Structure privée VAL: aléatoire = scala.util.random .

  3. Vous n'avez pas besoin de stocker une référence qui pointe toujours sur le même exemple de la classe, cela gaspille simplement la mémoire. Meilleure utilisation aléatoireNumbermodel.Instance directement XXX

  4. Vous avez plusieurs modèles utilisant le même aléatoire . Si votre programme a jamais eu plusieurs threads manipulant des modèles, notez

    Les instances de Java.Util.random sont threadsafe . Cependant, l'utilisation simultanée de la même instance Java.UTIL.Random à travers les threads peut rencontrer des conditions et une performance médiocres conséquente.

    Si vous utilisez ThreadLocalrandom il gère l'initialisation elle-même: XXX

  5. Voulez-vous que tous aléatoireNumbermodel s soit égal? Sinon, ne le faites pas classe de cas .


0 commentaires