2016-04-03 4 views
0

objectは、グローバルに利用可能なキャッシュを保持する必要があります。キャッシュを初期化するために、オブジェクトは、アプリケーション内で動作する第三者のフレームワークから得られた変数を渡す必要があります。工事中のオブジェクトにパラメータを渡す

オブジェクトはコンストラクタパラメータを取らないので、フレームワークからオブジェクトに変数を渡して、オブジェクト構築中に利用できるようにするにはどうすればよいですか?

回避策は、オブジェクト(サードパーティのフレームワーク変数を受け入れる)にinitメソッドを持たせ、足場のコードを追加することです。しかし、良い方法がありますか?

+0

"オブジェクトはコンストラクタパラメータを取らない...オブジェクト構築中に利用可能" - これは不可能であったと言って、それと同じ文章でどうやって行うのか尋ねましたか? –

答えて

1

ですから、自分でキャッシュを書くことはお勧めできません。仕事をより良くする図書館があります。 Mangoと呼ばれるこのScalaプロジェクトには、キャッシング能力を提供する優れたJavaベースのGuavaライブラリが含まれています。

あなたは(ドキュメントより)このようなコードを書くことができ、

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") // 

はまた、この時にも優れている ScalaCacheと呼ばれる簡単なライブラリがあります。 Check it hereこれは、マクロを使用するため、Scala 2.11以降でのみ有効です。

2

一般に、objectには可変状態を設定しません。しかし、本当に必要な場合は、varフィールドを置くことができます。

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

その状態を設定する必要がある場合は、割り当てによって行うことができます。

TheObject.globalMutableState = Some(???) 

それを参照する必要があれば、直接それを行うことができます。

TheObject.globalMutableState.get 
関連する問題