Я понимаю, что Enum
является Serializable. Следовательно, это безопасно. (selectedCountry enum Country
)
Исходное перечисление без переменных участника-пользователя
public enum Country {
Australia,
Austria,
UnitedState;
}
Фрагмент
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
selectedCountry = (Country)savedInstanceState.getSerializable(SELECTED_COUNTRY_KEY);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putSerializable(SELECTED_COUNTRY_KEY, selectedCountry);
}
Однако, что, если у меня есть несериализуемые члены в пользовательском классе enum? Например,
Исходные переменные участника-члена enum
package org.yccheok;
import org.yccheok.R;
/**
*
* @author yccheok
*/
public enum Country {
Australia(R.drawable.flag_au),
Austria(R.drawable.flag_at),
UnitedState(R.drawable.flag_us);
Country(int icon) {
this.icon = icon;
nonSerializableClass = new NonSerializableClass(this.toString());
}
public int getIcon() {
return icon;
}
public static class NonSerializableClass {
public NonSerializableClass(String dummy) { this.dummy = dummy; }
public String dummy;
}
private final int icon;
public NonSerializableClass nonSerializableClass;
}
Я тестировал. Оно работает. (Я тестировал, распечатывая все значения переменных-членов до и после сериализации. Они такие же до и после)
Однако я не понимаю, почему это работает? Поскольку я не предоставляю надлежащие readObject
и writeObject
, как требуется интерфейсом Serializable
.
Как указано в "Эффективной Java". Пункт 75: подумайте о том, как использовать пользовательскую сериализованную форму, мне нужно предоставить свои собственные readObject
и writeObject
, если у меня есть переменные-члены в моем перечислении?