Дополнительно
Сохранить enum в SharedPreference
Мне было интересно, какой метод используется, чтобы сохранить перечисление
до SharedPrefereces
? В настоящее время, я'м, используя дсын
, чтобы конвертировать enum в строку, а затем сохраните его в SharedPrefereces
.
Gson gson = new Gson();
// country is an enum.
String json_country = gson.toJson(country);
sharedPreferences.edit().putString(COUNTRY, json_country);
Мне было интересно, является ли это хорошим способом? Есть ли лучший способ?
34
5
Вы можете использовать простую строку для него, а затем извлечь значение с помощью метода valueOf. Вот пример:
Вот пример кода, который вы можете увидеть, как это работает. https://github.com/jiahaoliuliu/SavingEnumToSharedPreferences
Это та же проблема, что разработчиков корпоративных Java-лицо при сохранении перечислимый к базе данных. Проблема с существующим ответов заключается в том, что они хрупкие и не рефакторинг-дружелюбный. Здесь's, почему (с альтернативой в нижней части).
Используя перечислимый'ы
метод toString()
иметод valueOf()
методов означает, что значение типа enum может'т быть переименованы. Предположим, у меня естьVehicleType
перечисление со значениями "автомобиль" и "грузовик". Если я сохранить строку "и грузовик" в качестве параметра и затем переименоватьVehicleType.Грузовик " до " VehicleType.PICKUP_TRUCK в следующей версии моего приложения, сохраненные строки уже не имеет смысла и метод valueOf()
броситIllegalArgumentException
.Используя значение'с порядковым номером означает, что значения перечисляемого типа может'т быть переупорядочены или сохраненных значений уже не будет совпадать. Этот сценарий, пожалуй, хуже, потому что ваше приложение будет продолжать работать, но могут вести себя самым неожиданным образом, делая этот вопрос трудно отследить когда он'ы, наконец, заметили и, скорее всего, невозможно исправить. То же самое верно для добавления нового значения в любом месте, но итоге. Если я добавил новый
мотоцикл
значение в верхней части, "автомобиль", хранящиеся как его порядковый номер (0) в предыдущей версии приложения будут возвращатьсямотоцикл
после обновления, и "грузовик" (порядковый номер 1) стало бы "автомобиль".Альтернативу я использую это, чтобы добавить
окончательной
поле enum и использовать его значение, например:Хранить значение, используя что-то вроде предпочтения.putString("и vehicle_type наша" vehicleType.getCode ()) и получить его используя что-то вроде
vehicleType = VehicleType.lookupByCode(предпочтений.метода getString (на"vehicle_type" Ну, нуль))
.Этот подход требует немного больше кода, но на мой взгляд, это'ы наиболее надежное решение.
Вы можете assotiate ваши перечисления с целыми и хранить простые инт выглядеть так:
https://stackoverflow.com/questions/5878952/cast-int-to-enum-in-java (второй ответ) - тоже в такой же способ вы можете сделать
enumToInt
Учитывая все вышеперечисленные варианты, я решил использовать другое решение для этой проблемы.
Мне нужен только набор значений, без всякой логики на них. В этом случае можно использовать такие инструменты, как
@IntDef
и@StringDef
вместоперечисление
.Решение является безопасным для рефакторинга как в плане имен переменных и порядок переменных. Единственная вещь, которая не должна быть изменена, - фактические значения. Однако, по умолчанию инструменты рефакторинга выиграл'т просить вас, чтобы изменить их в случае переименования, это не так легко сделать это просто автоматически (и
@IntDef
лучше с этой точки зрения, чем@StringDef
).И вот [официальный документ doc][1]
[1]: https://developer.android.com/reference/android/support/annotation/IntDef.html на "официальные док"и
Здесь's приятный класс utils, которую я написал для этого. Это's очень обобщенное, чтобы соответствовать широкому спектру требований.