Влияет ли добавление ключевого слова "final" в методы в анонимных классах?

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

При создании анонимного класса в Java вы можете добавить дополнительные методы, если хотите:

Runnable r = new Runnable() {
    public void run() {
        internal();
    }

    public void internal() {
        .. code ..
    }
};

Однако Java также позволяет объявлять дополнительные методы как final:

public final void internal() { ... }

Мой вопрос: Не эффективны ли эти методы окончательно и добавляет ли ключевое слово final?

Ответ 1

Спецификация Java о final methods говорит:

A private и все методы, объявленные сразу в классе final (§8.1.1.2), ведут себя так, как будто они final, так как их невозможно переопределить.

и Анонимные объявления классов:

Анонимный класс всегда неявно final (§8.1.1.2).

Следовательно, анонимный класс уже final, что делает все его методы final. Вы можете добавить модификатор final, но он является избыточным.


Интересный комментарий Sotirios Delimanolis показывает, что API Reflection фактически не сообщает модификатор final для анонимного класса:

public class Main {
    public static void main(String[] args) {
        Main anon = new Main() {};
        System.out.println(Modifier.isFinal(anon.getClass().getModifiers())); // prints false
    }
}

Это, по-видимому, известный баг (JDK-8129576), который планируется установить на Java 9.