Таким образом, я должен проанализировать заголовок сообщения, где один байт заголовка определяет, как интерпретируется следующий байт. Все интерпретации могут быть представлены как перечисления. Что у меня есть (упрощенно):
enum MsgType { NOP, MSG_A, MSG_B, MSG_C; } // The type of the first byte
enum AInterp { FOO, BAR; } // Interpretation of 2nd byte if 1st byte is MSG_A
enum BInterp { ALPHA, BETA, GAMMA; } // " " " if 1st byte is MSG_B
enum CInterp { ONE, TWO, THREE, FOUR; } // " " " if 1st byte is MSG_C
AInterp a = null;
BInterp b = null;
CInterp c = null;
У каждого перечисления есть метод enumVal (), который возвращает перечисление для значения байта или ноль, если нет не один, но для этого вопроса мы просто будем использовать valueOf (). Входящий поток содержит заголовок, в котором один фрагмент определяет, как интерпретировать следующий фрагмент. Чтение из ByteBuffer BB:
MsgType m = MsgType.valueOf(BB.get());
byte secondByte = BB.get();
switch (m)
{
case NOP: /* no options */ break;
case MSG_A: a = AInterp.valueOf(secondByte); break;
case MSG_B: b = BInterp.valueOf(secondByte); break;
case MSG_C: c = CInterp.valueOf(secondByte); break;
default: /* no options /* break;
}
Я знаю, что отсутствуют блоки try / catch, но вы понимаете, в чем дело. Это становится очень громоздким очень быстро. Чтобы запросить значение a, b или c, я должен знать значение m, которое просто не соответствует цели.
Мне бы хотелось иметь возможность каким-то образом создать одну переменную для 2-й байт, и приведите его к типу перечисления, который был бы уместен, что-то вроде:
genericEnum x = null;
MsgType m = MsgType.valueOf(BB.get());
(typeCastingFrom(m)) x = (typeCastingFrom(m)).valueOf(BB.get())
Так что, я думаю, мне понадобится некоторая схема наследования для перечислений. Но Java этого не позволяет. В конечном итоге я просто сохраню 2-й байт как байт и интерпретирую его, когда мне нужно, на основе m. У кого-нибудь есть более элегантное решение?