@serializable final class Symbolprivate (val name: String) { override deftoString(): String = "'" + name @throws(classOf[java.io.ObjectStreamException]) private defreadResolve(): Any = Symbol.apply(name) } object Symbol extends UniquenessCache[String, Symbol] { protected defvalueFromKey(name: String): Symbol = new Symbol(name) protected defkeyFromValue(sym: Symbol): Option[String] = Some(sym.name) }
4.
/** This isprivate so it won't appear in the library API, but * abstracted to offer some hope of reusability. */ private[scala] abstract class UniquenessCache[K, V >: Null] { import java.lang.ref.WeakReference import java.util.WeakHashMap import java.util.concurrent.locks.ReentrantReadWriteLock private valrwl = new ReentrantReadWriteLock() private valrlock = rwl.readLock private valwlock = rwl.writeLock private val map = new WeakHashMap[K, WeakReference[V]] protected defvalueFromKey(k: K): V protected defkeyFromValue(v: V): Option[K]def apply(name: K): V = {def cached(): V = {rlock.lock try {val reference = map get name if (reference == null) null else reference.get // will be null if we were gc-ed } finally rlock.unlock }defupdateCache(): V = {wlock.lock try {val res = cached() if (res != null) res else { valsym = valueFromKey(name)map.put(name, new WeakReference(sym))sym } } finally wlock.unlock }val res = cached() if (res == null) updateCache() else res }defunapply(other: V): Option[K] = keyFromValue(other) }
5.
def product =Twitter.search / "search.json" <<? params ># ('results ! (list ! obj))Twitter.scala‘results を使っているんですが、理由はあまりないと思います。Dispatchで使っているSymbolはStringでやっても大丈夫はず。理由はdef << (t: T)(js: JsValue) = js match { case JsObject(m) => JsObject(m + (JsString(sym) -> JsValue(t))) case js => error("Unable to replace property in " + js)}形でJsStringの部分ですが、その部分はこれがSymbolか、Stringかをmatch している。http://sourced.implicit.ly/net.databinder/dispatch-json/0.7.7/dispatch/Json.scala.html#15592 参照Symbolはmapとかを表現する時、Stringと区分するため、使っているはず。Symbol.name = String