Если вам нужно что-то лаконичное и относительно безопасное, вы можете просто перенести проверку типов во время компиляции на время выполнения:
static final Map<String, Integer> map = MapUtils.unmodifiableMap(
String.class, Integer.class,
"cat", 4,
"dog", 2,
"frog", 17
);
Эта реализация должна отлавливать любые ошибки:
import java.util.HashMap;
public abstract class MapUtils
{
private MapUtils() { }
public static <K, V> HashMap<K, V> unmodifiableMap(
Class<? extends K> keyClazz,
Class<? extends V> valClazz,
Object...keyValues)
{
return Collections.<K, V>unmodifiableMap(makeMap(
keyClazz,
valClazz,
keyValues));
}
public static <K, V> HashMap<K, V> makeMap(
Class<? extends K> keyClazz,
Class<? extends V> valClazz,
Object...keyValues)
{
if (keyValues.length % 2 != 0)
{
throw new IllegalArgumentException(
"'keyValues' was formatted incorrectly! "
+ "(Expected an even length, but found '" + keyValues.length + "')");
}
HashMap<K, V> result = new HashMap<K, V>(keyValues.length / 2);
for (int i = 0; i < keyValues.length;)
{
K key = cast(keyClazz, keyValues[i], i);
++i;
V val = cast(valClazz, keyValues[i], i);
++i;
result.put(key, val);
}
return result;
}
private static <T> T cast(Class<? extends T> clazz, Object object, int i)
{
try
{
return clazz.cast(object);
}
catch (ClassCastException e)
{
String objectName = (i % 2 == 0) ? "Key" : "Value";
String format = "%s at index %d ('%s') wasn't assignable to type '%s'";
throw new IllegalArgumentException(String.format(format, objectName, i, object.toString(), clazz.getSimpleName()), e);
}
}
}
Я думаю, что сейчас я просто собираюсь продолжать использовать HDF5 для постоянного хранения данных вместе с H2 или какой-либо другой базой данных для индексации в памяти. Я не могу заставить SQLite использовать большие двоичные объекты с драйвером Java, который у меня есть, и я не могу запустить и запустить встроенный Firebird, и я пока не доверяю H2 с PAGE_STORE.
Если вам нужен только доступ для чтения, тогда H2 может читать файлы базы данных из zip-файла .
Аналогичным образом, если вам не требуется постоянство, можно иметь версию H2 только в памяти.
Если вам нужны как доступ для чтения / записи, так и постоянство, тогда вам может не повезти со стандартными базами данных типа SQL, поскольку они почти все единообразно поддерживают файлы индекса и данных отдельно.
H2 использует только один файл, если вы используете последнюю сборку H2 с параметром PAGE_STORE. Это новая функция, поэтому она может быть не очень надежной.
Однажды я использовал базу данных объектов, которая сохранила свои данные в файл. Он имеет интерфейс Java и .NET. Возможно, вы захотите это проверить. Он называется db4o .
Если вы ищете небольшую и быструю базу данных, которая, возможно, будет поставляться с другой программой, я бы проверил Apache Derby Я не знаю, как бы вы определяли встроенную базу данных, но Я использовал это в некоторых проектах в качестве базы данных отладки, которую можно проверить с помощью источника и которая мгновенно доступна на каждой машине разработчика.
Это не механизм SQL, но если вы используете Prevayler с XStream , вы можете легко создать один XML-файл со всеми вашими данными. . (Превейлер называет это файлом моментального снимка.)
Хотя он не основан на SQL и требует небольшого количества смазки, его автономный характер значительно упрощает разработку (и особенно хорошее тестирование). Кроме того, он невероятно быстрый и надежный.
Вы можете попробовать jdbm - мы используем его в нескольких проектах, и это довольно быстро. Он действительно использует 2 файла (файл базы данных и файл журнала), если вы используете его для приложений типа ACID, но вы можете напрямую перейти к прямому доступу к базе данных (без файла журнала), если вам не нужен твердый ACID.
JDBM легко поддерживает целые числа и капли (все, что угодно) и работает довольно быстро. На самом деле он не предназначен для параллелизма, поэтому вам придется самостоятельно управлять блокировкой, если у вас несколько потоков, но если вы ищете простую и надежную встроенную базу данных, это хороший вариант.
Поскольку вы упомянули sqlite, я предполагаю, что вы не возражаете против собственной базы данных (пока доступны хорошие привязки java). Firebird хорошо работает с java и по умолчанию хранит отдельные файлы.
И H2, и HSQLDB были бы отличным выбором, если бы у вас не было требований к одному файлу.