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
}
3 Réponses :
Essayez
Remarque: Si un modèle peut être utilisé simultanément, considérez docs.oracle.com/javase/7/docs/api/java/util/concurrent/... .
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
}
}
Ceci est principalement une réponse à votre propre réponse, mais ne correspond pas dans un commentaire.
Scala a une alternative intégrée et sans sécurité à ce que vous faites avec Puisque vous avez toujours besoin d'initialiser l'instance lorsque vous utilisez 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 Vous avez plusieurs modèles utilisant le même Si vous utilisez Voulez-vous que tous var _Instance code> et instance code>: . En utilisant nous obtenons p>
aléatoireNumbermodel code>, vous n'obtenez aucun avantage de paresseux code> pour ce cas, seulement un peu mineur aérien. Non paresseux val code> 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 code>. P> li>
aléatoireNumbermodel.Instance code> directement p>
aléatoire code>. Si votre programme a jamais eu plusieurs threads manipulant des modèles, notez p>
ThreadLocalrandom code> il gère l'initialisation elle-même: p>
aléatoireNumbermodel code> s soit égal? Sinon, ne le faites pas classe de cas code>. P> li>
ol> p>