Как обрабатывать разные объекты базы данных в одном методе JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Как обрабатывать разные объекты базы данных в одном методе Java

Сообщение Anonymous »

Я пишу библиотеку, которая обрабатывает хранение данных на разных уровнях. Большинство объектов сохраняются в некоторой базе данных горячего уровня (DynamoDB) для быстрого доступа и в конечном итоге перемещаются в базу данных холодного уровня (s3). Чтобы воспользоваться преимуществами стоимости хранения данных на холодном уровне, записи группируются в блоки во время миграции между уровнями.
Мои модели горячего уровня выглядят примерно так, как показано ниже, и хранятся как один объект за строку:

Код: Выделить всё

// Hot Tier Model #1
class Index {
String key;
Object indexData;
}

// Hot Tier Model #2
class Record {
String key;
Object data;
}
Мои модели холодного уровня выглядят примерно так:

Код: Выделить всё

// Cold Tier Model
class ColdTierRecord {
Index indexRecord;
List records;
}
Я бы хотел, чтобы клиенты могли получить доступ к обоим объектам, не раскрывая детали уровня хранения (горячий или холодный уровень). Кроме того, модель холодного уровня определяется клиентом, и я не хочу, чтобы библиотека зависела от нее.
Сначала я определил API для библиотеки следующим образом:
Сначала я определил API для библиотеки следующим образом:
p>

Код: Выделить всё

// Library API
public  T get(String keyPrefix, String keySuffix) {
// hot-tier records type is determined using type inference
return databaseAdapter.get(keyPrefix, keySuffix); // Adapter deserializes to type T
}

// Client Code
Index index = get(indexKey, indexKeySuffix);
// or
Record record = get(recordKey, recordKeySuffix);
Но проблема в том, что теперь у клиента нет возможности получить ColdTierRecord.
Я подумал о том, чтобы клиент внедрил некоторые адаптер для преобразования из ColdTierRecord в Index и Record, но это усложняет обновление ColdTierRecord, поскольку нам нужно перезаписать весь объект.
Я рассмотрел следующее:

Код: Выделить всё

class GetResponse {
String className; // ColdTierRecord.class
Object data;
}

// Library API
public  GetResponse get(String keyPrefix, String keySuffix) {
T data = databaseAdapter.get(keyPrefix, keySuffix);
return GetResponse.builder()
.className(data.getClass().getName())
.data(data)
.build();

}

// Client Code
GetResponse response = get(key, keySuffix);

// Switch based off of className and cast appropriately
// ...
Есть ли более элегантный способ создать интерфейс библиотеки, который инкапсулирует детали хранилища, предоставляя клиенту их сохраненные типы? Или это Object, className и кастинг единственный способ?


Подробнее здесь: https://stackoverflow.com/questions/787 ... ava-method

Вернуться в «JAVA»