Eclipse добавляет @Override аннотации, когда я реализую методы интерфейса. Eclipse, кажется, не имеет никакой проблемы с этим. И наш автоматизированный процесс сборки от Круиз-контроля, кажется, не имеет никакой проблемы с этим. Но когда я создаю из командной строки с муравьем, работающим javac, я получаю эту ошибку:
[javac] C:\path\project\src\com\us\MyClass.java:70: method does not override a method from its superclass
[javac] @Override
[javac] ^
[javac] 1 error
Eclipse работает под Java 1.6. Круиз-контроль выполняет Java 1.5. Моя сборка муравья перестала работать, независимо от которой версии Java я использую.
Спецификация аннотации @Override
изменилась в Java 1.6. В Java 1.5 компилятор не разрешал аннотацию @Override
для реализованных методов интерфейса, но в 1.6 это было. Первый результат поиска, который я нашел, - это запись в блоге здесь. . Это не было хорошо задокументировано , но все же изменилось.
Eclipse добавляет его, потому что ваш Eclipse настроен на совместимость с 1.6. Вам следует попытаться сохранить среду сборки и eclipse на одной и той же версии Java. Мне неясно, что вы указали, что круиз-контроль работает с Java 5, независимо от того, компилируется ли он с использованием отдельного JDK6 или нет.
Отдельно от правил аннотации 1.5 и 1.6 @Override
, помните, что Eclipse имеет собственную реализацию компилятора (не javac
) и иногда будет вести себя иначе. Каждый раз, когда что-то компилируется в Eclipse, но не в Ant или Maven, вам нужно будет найти способ порадовать оба компилятора.
Я действительно не могу объясните проблему, которую вы видите, но похоже, что это связано с тем фактом, что JDK 5 не разрешает @Override
для реализованных методов интерфейса , только на переопределенных методах, присутствующих в суперклассе .
JDK 6 разрешит @Override
на любом из них.
Если ваша сборка ant не удалась, возможно, он передает параметр source
в javac, запрашивая соответствие JDK 5.
безопасно ли вызывать этот метод из внутри web-страниц
Это действительно зависит от того, что вы делаете в методе. Этот метод, вероятно, должен быть функцией без побочных эффектов.
Создание нового потока для каждого page-call
Да.
does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session??
Да.
Если вы хотите быть пуристом, не рекомендуется полагаться на статические методы, поскольку они затрудняют проверку вашего кода в изоляции. Если класс A вызывает статический метод класса B, вы никогда не сможете протестировать класс A без тестирования/вызова B
-121--3366954- Я не могу на самом деле объяснить проблему, которую вы видите, но она, похоже, связана с тем, что JDK 5 не разрешит @ Override
для реализованных методов интерфейса , только для переопределенных методов, присутствующих в суперклассе .
JDK 6 разрешит @ Override
для любого из них.
Если сборка ant завершается неуспешно, возможно, передается параметр source
в javac с запросом соответствия JDK 5.
@ Переопределить
тэги для реализованных методов являются новыми для Java 1,6. В Java 1,5 @ Override
является правильным только при переопределении метода в базовом классе. Подробнее здесь и здесь .
Eclipse будет указывать на версию Java 1.6, а не на 1.5. См. Здесь для настройки версии java в eclipse.
Прямой ответ на вопрос «Почему» возникает ошибка javac, когда @Override используется в контексте реализации метода, фактически находится в спецификациях java:
«Причина в том, что конкретный класс реализующий интерфейс обязательно переопределит все методы интерфейса, независимо от аннотации @Override, и поэтому было бы запутанно, если бы семантика этой аннотации взаимодействовала с правилами реализации интерфейсов. "
См. http: / /java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4
Но, видимо, кто-то передумал использовать java 1.6 и 1.5 u21 ...