Есть ли неподдерживаемая аннотация операции в Java? - PullRequest
10 голосов
/ 27 октября 2010

Есть ли в java аннотации, которые помечают метод как неподдерживаемый?Например, скажем, я пишу новый класс, который реализует интерфейс java.util.List.Методы add () в этом интерфейсе являются необязательными, и они мне не нужны в моей реализации, поэтому я должен сделать следующее:

public void add(Object obj) {
   throw new UnsupportedOperationException("This impl doesn't support add");
}

К сожалению, с этим можно обнаружить только во время выполнениячто, на самом деле, эта операция не поддерживается.

В идеале, это было бы замечено во время компиляции, и такая аннотация (например, возможно @UnsupportedOperation) подтолкнула бы IDE к тому, чтобы сказать любому пользователю этого метода: «Эй, вы используете неподдерживаемую операцию"таким образом, что использование @Deprecated помечает Eclipse для выделения любого использования устаревшего элемента.

Ответы [ 3 ]

10 голосов
/ 27 октября 2010

Хотя на первый взгляд это звучит полезно, в действительности это не сильно поможет. Как вы обычно используете список? Я обычно делаю что-то вроде этого:

List<String> list = new XXXList<String>();

Там уже есть одно косвенное указание, поэтому, если я вызову list.add("Hi"), как компилятор узнает, что эта конкретная реализация списка не поддерживает это?

Как насчет этого:

void populate(List<String> list) {
    list.add("1");
    list.add("2");
}

Теперь это еще сложнее: компилятор должен проверить, что все вызовы этой функции используют списки, поддерживающие операцию add().

Так нет, нет способа сделать то, что вы просите, извините.

4 голосов
/ 27 октября 2010

Вы можете сделать это, используя 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());
}
1 голос
/ 01 августа 2018

(2018) Хотя это может быть невозможно обнаружить во время компиляции, может быть альтернатива.то есть IDE (или другие инструменты) могут использовать аннотацию, чтобы предупредить пользователя о том, что используется такой метод.

На самом деле для этого есть билет: JDK-6447051

С технической точки зрения это не должно быть намного сложнее, чем проверки, которые обнаруживают незаконное использование @NotNull или @Nullable аксессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...