Декомпиляция всегда будет несовершенной. Декомпилятор должен взять байт-коды и выполнить обратный инжиниринг исходного источника, выяснить, где находятся циклы, каковы элементы управления циклами и т. Д. Я бы никогда не ожидал, что это будет безупречно для нетривиальных программ.
В случае $ names это имена, сгенерированные внутренне в процессе «фальсификации» внутренних классов (поскольку JVM фактически не поддерживает внутренние классы). Декомпилятор, очевидно, выполняет несовершенную работу по выяснению того, что представляют собой внутренние классы, и, соответственно, присваивая им имена и объекты, созданные компилятором, чтобы имитировать вещи. Кто-то, знакомый с форматом байт-кода, вероятно, мог бы разобраться довольно быстро, но, как и все остальное, это нетривиально.
(В данном конкретном случае создается впечатление, что компилятор по какой-то причине создал таблицу сопоставления из внутренних значений перечисления для некоторых других значений, а когда вы «обрезали» оператор, вы потеряли это сопоставление.)
[Я добавлю, что одна большая проблема, с которой сталкиваются декомпиляторы, заключается в том, что javac является такой движущейся целью. В частности, такие вещи, как реализации внутреннего класса, постоянно изменяются, поэтому то, что сработало одну неделю, может потерпеть неудачу на следующей, со следующей версией +.001 компилятора.]