2009-06-15 2 views
7

Иногда структуры данных должны иметь определенные отношения, которые не могут быть непосредственно описаны в Java, но хорошо проверить как можно раньше, когда код будет отредактирован. Классическими примерами являются то, что массив достаточно большой или что перечисления в разных модулях имеют соответствующие члены.Как утверждать что-то во время компиляции в Java?

BOOST предоставляет прекрасное средство «статического утверждения» на C++, которое даже обеспечивает полупристойные ошибки, когда утверждения терпят неудачу; Кто-нибудь знает, как построить средство утверждения времени компиляции в Java?

Редактировать: Я только что увидел прекрасный пример: класс this из Eclipse имеет два постоянных массива, которые предполагаются одинаковой длины. Если бы это был мой код, я бы хотел, чтобы компилятор сказал мне, имеют ли они разную длину.

+3

Я не знаю, что я согласен, что «структуры данных должны иметь определенные отношения, которые не могут быть непосредственно описаны в Java». Ваши примеры выглядят недействительными. Связь размера массива с остальной программой может быть выражена путем определения размера массива с переменной. И если у вас есть Enum в одном пакете, почему бы вам просто не ссылаться на него с другого? На самом деле я не могу придумать, почему несколько Enums имеют соответствующие элементы. Если Foo должен иметь те же элементы, что и Bar, почему бы просто не использовать Foo повсюду? Разве это не пункт Enum? –

+0

Можете ли вы представить более конкретный пример того типа вещей, который вы хотели бы утверждать таким образом? –

ответ

2

Инкрементальные компиляторы, входящие в состав IDE, таких как Eclipse, могут быть настроены так, чтобы бросать предупреждения или ошибки при поиске кода, который является законным java, но может вызвать проблемы во время выполнения. Вы можете взломать эти настройки, насколько вам нравится, хотя это может начать становиться инвазивным и раздражать.

7

Есть целый ряд инструментов, которые можно использовать

  • PMD
  • Checkstyle
  • FindBugs
  • Validate методы в Jakarta Commons-Ланг (мы используем это вместо того, чтобы отстаивать и оставить его в)
  • Cobertura/EMMA (для покрытия кода).

Сочетание этих и хорошие модульных тестов будет поймать низко висящие фрукты (и некоторые из более высокого материала, а)

+1

+1 для использования модульных тестов как по существу шаг, который ближе к времени компиляции, чем время выполнения. –

Смежные вопросы