Обращаясь к результатам, собранным до сих пор, предлагается пара решений:
- Использовать сопоставление с образцом (приводит к фрагментации различных стратегий работы с различными типами параметров)
- Используйте отражение (слишком дорого для чего-то, что в идеале должно быть очень быстро )
- ... и добавление того, что я в итоге реализовал: написать адаптер для каждого типа параметра.
Чтобы быть более точным, все упражнение было посвящено написанию обертки вокруг кабинета Киото. В Kyoto Cabinet есть методы для привязки ключей байтового массива к значениям байтового массива и ключей String со значениями String. И затем он в основном копирует большинство операций для работы с ключами и значениями как для байтового массива, так и для строк.
Чтобы создать оболочку Map вокруг класса DB кабинета Киото, я определил черту TypedDBOperations [T], где T - тип параметра, и реализовал его дважды. Если я сейчас создам Map [Array [Byte], Array [Byte]], неявное преобразование автоматически назначит ему соответствующий экземпляр TypedDBOperations, вызывая основанные на Array [Byte] операции класса DB.
Это та черта, о которой я говорил:
trait TypedDBOperations[K,V] {
def get(db: DB, key: K): V
def set(db: DB, key: K, value: V): Boolean
def remove(db: DB, key: K): Boolean
def get(cursor: Cursor): (K, V)
}
И это реализации для обоих типов комбинаций значений ключей:
implicit object StringDBOperations extends TypedDBOperations[String] {
def get(cursor: Cursor) = {
val Array(a, b) = cursor.get_str(false)
(a, b)
}
def remove(db: DB, key: String) = db.remove(key)
def set(db: DB, key: String, value: String) = db.set(key, value)
def get(db: DB, key: String) = db.get(key)
}
implicit object ByteArrayOperations extends TypedDBOperations[Array[Byte]] {
def get(cursor: Cursor) = {
val Array(a, b) = cursor.get(false)
(a, b)
}
def remove(db: DB, key: Array[Byte]) = db.remove(key)
def set(db: DB, key: Array[Byte], value: Array[Byte]) = db.set(key, value)
def get(db: DB, key: Array[Byte]) = db.get(key)
}
Не самое удачное решение, но оно выполняет свою работу. Опять же, обратите внимание, что дублирования все еще немного, но, похоже, от него не избавиться.