- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
if (operator instanceof TUOperatorStacker) {
dump.put("operator_type", "TUOperatorStacker");
} else if (operator instanceof TUOperatorDestacker) {
dump.put("operator_type", "TUOperatorDestacker");
} else if (operator instanceof TUOperatorTargetedStacker) {
dump.put("operator_type", "TUOperatorTargetedStacker");
} else if (operator instanceof TUOperatorTargetedDestacker) {
dump.put("operator_type", "TUOperatorTargetedDestacker");
}
<...>
String typeString = (String) dump.get("operator_type");
TUOperator operator = null;
if (typeString.equals("TUOperatorStacker")) {
operator = new TUOperatorStacker(simElement);
} else if (typeString.equals("TUOperatorDestacker")) {
operator = new TUOperatorDestacker(simElement);
} else if (typeString.equals("TUOperatorTargetedStacker")) {
operator = new TUOperatorTargetedStacker(simElement);
} else if (typeString.equals("TUOperatorTargetedDestacker")) {
operator = new TUOperatorTargetedDestacker(simElement);
}
kegdan 19.08.2014 12:01 # 0
someone 19.08.2014 12:20 # 0
Думаю, как бы написать красивее. Рефлексией, что ли? Или, может, guice + multibindings + assistedinject?
kegdan 19.08.2014 12:26 # 0
someone 19.08.2014 12:28 # 0
(Записывать полное имя класса и дёргать конструктор рефлексией нельзя - обратная совместимость-с.)
kegdan 19.08.2014 12:35 # 0
Как минимум стоки можно заменить какими нибудь ID.
А что не так с обратной совместимостью? я немного туплю
roman-kashitsyn 19.08.2014 12:39 # 0
Видимо, уже существует куча сериализованных данных, не хранящих полного имени.
kegdan 19.08.2014 12:41 # 0
someone 19.08.2014 12:42 # 0
Пока мне приходят на ум три решения:
1. Поскольку все четыре класса лежат в одном пакете, использовать имя пакета (определяя его по базовому классу) и прибавлять к нему имя класса
2. Сделать Map<String, Class> и через рефлексию находить конструктор.
3. Самый продвинутый вариант - использовать guice-assistedinject с фабричным интерфейсом и получать нужный класс через Names.named.
kegdan 19.08.2014 12:43 # 0
someone 19.08.2014 12:46 # 0
Кстати, там есть ещё совсем старый формат, очень хрупкий - использует стандартную жабью сериализацию.
kegdan 19.08.2014 12:52 # 0
эээ, зачнем? Одному классу дилегировал сериализацию и не мучаешься. Какой нибудь SerializeManager. Зацепление вырастет
someone 19.08.2014 12:53 # 0
Писалось это в начале нулевых.
Xom94ok 19.08.2014 19:21 # 0
Я за второй вариант. Нафиг к такой маленькой проблеме городить десяток говноабстракций? К тому же, симметрично: был один костыль, а стало два.
roman-kashitsyn 19.08.2014 12:46 # 0
Для каждого класса создаём по (де)сериалайзеру, упаковывающему/распаковывающему объект. Регистрируем их в мапе объекта-фабрики на соответствующие текстовые ключи. При записи объекта выгребаем сериалайзер по типу, при чтении - десериалайзер по магической строке.
Вроде ничего лучше пока не придумано :(
roman-kashitsyn 19.08.2014 12:19 # 0