Есть ли в 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());
}