Есть ли в Java неподдерживаемая аннотация?
Есть ли какие-либо аннотации в java, которые отмечают метод как неподдерживаемый? Например. Скажем, я пишу новый класс, который реализует интерфейс java.util.List
. Методы add() в этом интерфейсе являются необязательными, и я не нуждаюсь в них в моей реализации, и поэтому я делаю следующее:
public void add(Object obj) {
throw new UnsupportedOperationException("This impl doesn't support add");
}
К сожалению, при этом он не может обнаружить, что на самом деле эта операция не поддерживается.
В идеале это было бы поймано во время компиляции, и такая аннотация (например, может быть @UnsupportedOperation
) подтолкнула бы среду IDE к любым пользователям этого метода: "Эй, вы используете неподдерживаемую операцию" в который использует флаги @Deprecated
Eclipse для выделения любых применений устаревшего элемента.
Ответы
Ответ 1
Хотя на поверхности это звучит полезно, на самом деле это не сильно поможет. Как обычно вы используете список? Обычно я делаю что-то вроде этого:
List<String> list = new XXXList<String>();
Там уже существует одна косвенность, поэтому, если я вызываю list.add("Hi")
, как компилятор должен знать, что эта конкретная реализация списка не поддерживает это?
Как насчет этого:
void populate(List<String> list) {
list.add("1");
list.add("2");
}
Теперь это еще сложнее: компилятору нужно будет проверить, что для всех вызовов этой функции используются списки, поддерживающие операцию add()
.
Нет, нет способа сделать то, о чем вы просите, извините.
Ответ 2
Вы можете сделать это с помощью AspectJ, если вы знакомы с ним. Сначала вы должны создать точечный снимок, затем дать совет или объявить точки с ошибкой/предупреждением, соответствующие этому пункту. Конечно, вам нужен собственный интерфейс аннотации @UnsupportedOperation. Я дал простой фрагмент кода об этом.
// This the point-cut matching calls to methods annotated with your
// @UnsupportedOperation annotation.
pointcut unsupportedMethodCalls() : call(@UnsupportedOperation * *.*(..));
// Declare an error for such calls. This causes a compilation error
// if the point-cut matches any unsupported calls.
declare error: unsupportedMethodCalls() : "This call is not supported."
// Or you can just throw an exception just before this call executed at runtime
// instead of a compile-time error.
before() : unsupportedMethodCalls() {
throw new UnsupportedOperationException(thisJoinPoint.getSignature()
.getName());
}