Как определить интерфейс, который заставляет IDE показывать предупреждение «не объявлено»? - PullRequest
3 голосов
/ 02 февраля 2012

Когда вы реализуете Serializable для своего класса, IDE показывает предупреждение, что Сериализуемый класс YOURCLASS не объявляет статическое окончательное поле serialVersionUID типа long.

Как определить интерфейс, который заставляет IDE отображать это предупреждение для моего поля?

public class MyClass implements Serializable 
{
    // this class has warning
}

public class MyClass implements MyInterface
{
    // I want to have warning for this class
}

public interface MyInterface{
    public static final long myField;
}

Ответы [ 5 ]

3 голосов
/ 10 февраля 2012

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

Определения Pointcut оставлены в качестве упражнения для читателя: -)

@Aspect
public class ArchitecturalEnforcement {
    @Pointcut("...")
    public void implementsInterface() {}

    @Pointcut("...")
    public void definesConstant(){}

    /** Advice that defines an error when a GUI method calls a method in the DAO layer */
    @DeclareWarning("implementsInterface() && !definesConstant()")
    private static final String WARNING= "...";
}

Подробнее AOP (Аспектно-ориентированное программирование)

3 голосов
/ 02 февраля 2012

Это особый случай, применимый только в случае классов, реализующих интерфейс Serializable и настраиваемый в eclipse.Windows--->Preference--->Compile--Error/warnings-->Potential programming problems---> Это где Eclipse имеет конфигурацию для этого.Даже если вы заставляете IDE отображать предупреждение другим способом для вашего класса, при компиляции с использованием javac это не будет принудительно.

2 голосов
/ 02 февраля 2012

Это не имеет ничего общего с тем, какую IDE вы используете, это связано с тем, что вы объявили свой интерфейс неправильным. Ваш интерфейс должен содержать сигнатуры методов, и прямо сейчас в вашем примере он содержит только объявление константы. Чтобы ваш интерфейс был действительным, он должен выглядеть примерно так:

public interface MyInterface{
   public long doSomethingAndReturnALong();
   public void doSomethingElseButRequireAnInt(int var);
}

Если вы объявляете переменные любого типа в интерфейсе, как вы делали выше, предполагается, что они статические и конечные, также известные как константы, которые не могут быть изменены классами, реализующими интерфейс.

Надеюсь, это поможет! David

1 голос
/ 09 февраля 2012

IDE не та, которая выдает предупреждение.Это компилятор.Если вам нужно специальное предупреждение, вам нужен специальный компилятор.Но тогда вам следует распространять компилятор с вашим интерфейсом.

Чтобы создать собственный компилятор, вы можете использовать:
http://today.java.net/article/2008/04/09/source-code-analysis-using-java-6-apis

В основном вам нужно определить собственную аннотацию и аннотациюпроцессор.Возможно, вы создадите аннотацию для вашего интерфейса, что, когда класс реализует его и не определяет переменную, вы выдадите предупреждение.
Я еще этого не сделал, поэтому не могу дать вам больше информации об этом.

Другая возможность - использовать существующий плагин компилятора, который определяет пользовательские предупреждения и аннотации: https://checkerframework.org/
Я не знаю, поможет ли это вам в ваших поисках, или вам в конечном итоге следует написать свой собственный плагин компилятора.

PS: также проверить этот пост:
Как преднамеренно вызвать предупреждающее сообщение о компиляторе Java?

1 голос
/ 08 февраля 2012

Как правило, это невозможно с интерфейсами в Java.

Если вы хотите, чтобы поле было общедоступным, вам все равно следует предоставить методы получения и установки для него.Вы можете объявить эти методы в интерфейсе, что, конечно же, приведет к ошибке компилятора, если реализующий класс не объявит их.

Если вы хотите, чтобы у классов было только закрытое поле, которое вы бы использовали прив какой-то точке доступа по рефлексии вы должны подумать, есть ли другое решение, которое не нуждается в поле.Возможно, также можно использовать методы?

Последний вариант - использовать инструмент статического анализа, такой как FindBugs , который позволяет определять пользовательских шаблонов ошибок .Таким образом, вы должны написать правило, которое находит разработчиков вашего интерфейса без этого поля и включить его в вашей конфигурации FindBugs.Существует хороший плагин Eclipse для FindBugs, который отображает предупреждения FindBugs в вашем коде (как обычные предупреждения Eclipse).

...