2016-04-03 11 views
0

Ein object muss einen global verfügbaren Cache enthalten. Um den Cache zu initialisieren, muss dem Objekt eine Variable übergeben werden, die von einem Framework eines Drittanbieters stammt, das in der Anwendung ausgeführt wird.Übergeben von Parametern an ein Objekt auf Konstruktion

Wie Objekte Konstruktorparameter nicht übernehmen, wie ist es möglich, die Variable aus dem Framework an das Objekt übergeben, so dass es während der Objektkonstruktion verfügbar ist?

Eine Problemumgehung wäre, eine Init-Methode für das Objekt zu haben (die die Framework-Variable des Drittanbieters akzeptiert) und einen Gerüstcode hinzuzufügen. Aber gibt es einen besseren Weg?

+0

"Objekte nehmen Konstruktorparameter nicht an ... verfügbar während der Objektkonstruktion" - Haben Sie gerade gesagt, dass das unmöglich ist, und dann fragen, wie man es im selben Satz macht? –

Antwort

1

Hmm so würde ich nicht empfehlen, einen Cache selbst zu schreiben. Es gibt Bibliotheken, die die Arbeit besser machen. Es gibt dieses Scala-Projekt mit der Bezeichnung Mango, das die ausgezeichnete Java-basierte Bibliothek Guava umschließt, die Caching-Fähigkeiten bietet.

Sie könnten Code wie folgt schreiben (Aus der Dokumentation),

import java.util.concurrent.TimeUnit 
import org.feijoas.mango.common.cache._ 

// the function to cache 
val expensiveFnc = (str: String) => str.length //> expensiveFnc : String => Int 

// create a cache with a maximum size of 100 and 
// exiration time of 10 minutes 
val cache = CacheBuilder.newBuilder() 
.maximumSize(100) 
.expireAfterWrite(10, TimeUnit.MINUTES) 
.build(expensiveFnc)    //> cache : LoadingCache[String,Int] 

cache("MyString") // 

Auch gibt es eine einfache Bibliothek namens ScalaCache, die auf diese ausgezeichnet. Check it here Dies funktioniert nur mit Scala 2.11, da die Verwendung von Makros.

2

Im Allgemeinen setzen Sie keinen veränderbaren Zustand auf eine object. Aber wenn Sie wirklich brauchen, könnten Sie ein var Feld darauf setzen.

object TheObject { 
    var globalMutableState: Option[TheStateType] = None 
} 

Was auch immer diesen Zustand setzen muss, kann so mit einer Zuordnung tun.

TheObject.globalMutableState = Some(???) 

Und was immer darauf Bezug nehmen muss, kann dies direkt tun.

TheObject.globalMutableState.get 
Verwandte Themen