Прямая совместимость обрабатывается путем соответствующей обработки неизвестных языковых конструкций, например, путем реализации ElementVisitor.visitUnknown .
В упомянутом блоге Oracle есть еще одна запись, в которой предлагаются две политики, касающиеся прямой совместимости:
- Запишите процессор для работы только с текущей языковой версией.
- Напишите процессор, чтобы справиться с неизвестными будущими конструкциями.
Второе делается путем возврата SourceVersion.latest()
, как уже опубликовано в вопросе.
Я думаю, что это нормально в большинстве случаев, когда вы уверены, что дополнительные языковые элементы ничего не сломают. Конечно, вы не должны просто предполагать, что все будет хорошо, даже с более новыми версиями, вы должны также проверить это.
Хорошо, я думаю, надлежащим образом обрабатывает конструкции на неизвестном языке звучит немного расплывчато, так что вот несколько примеров.
Предполагается, что у вас есть процессор, который проверяет пользовательский тип аннотаций на известных языковых конструкциях (например, аннотации для класса) и создает простую документацию о том, что он обнаружил. Вы, вероятно, можете с уверенностью предположить, что он также будет работать в более новых версиях. На мой взгляд, ограничение конкретной версии не будет хорошим решением.
Предположим, у вас есть процессор, который проверяет каждый элемент, который он может найти, и анализирует структуру кода, чтобы сгенерировать из него график. Вы можете получить проблемы с более новыми версиями. Вы можете каким-то образом обрабатывать конструкции на неизвестном языке (например, добавляя узел unknown к графу), но делайте это только в том случае, если это имеет смысл - и если оно того стоит. Если процессор просто бесполезен, когда сталкивается с чем-то неизвестным, он, вероятно, должен придерживаться определенной версии Java.
Независимо от используемой политики, на мой взгляд, лучшим способом было бы отслеживать предстоящие изменения языка и соответственно обновлять процессор. В Java 7, например, project coin ввел некоторые новые языковые функции, которые, скорее всего, даже не видны процессору. Java 8, с другой стороны, имеет новые конструкции, которые будут влиять на обработку, например аннотации типа . Новые языковые функции встречаются не так часто, поэтому, скорее всего, вам даже не нужно ничего менять в течение длительного времени.