В Java совершенно законно определять final
аргументы в интерфейсных методах и не подчиняться таковым в реализующем классе, например:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
В приведенном выше примере bar
и baz
имеет противоположные final
определения в классе VS интерфейс.
Таким же образом никакие final
ограничения не применяются, когда один метод класса расширяет другой, abstract
или нет.
Хотя final
имеет некоторое практическое значение внутри тела метода класса, есть ли смысл указывать final
параметры метода интерфейса?
final
все равно ничего не делает с нативными типами, так как они копируются.interface
определения различаются только поfinal
атрибуту аргумента, то результирующие.class
файлы одинаково побайтны (и, конечно,javap -v
выдают одинаковый вывод).final
Кстати, то же самое верно для двух классов, которые отличаются только по атрибуту!Ответы:
Не похоже, что в этом есть смысл. Согласно спецификации языка Java 4.12.4 :
Однако
final
модификатор параметра метода не упоминается в правилах сопоставления сигнатур переопределенных методов, и он не влияет на вызывающую функцию, только в теле реализации. Также, как отметил Робин в комментарии,final
модификатор параметра метода не влияет на сгенерированный байт-код. (Это не относится к другим видам использованияfinal
.)источник
final
модификатор не применяется к классу реализации. Ваша подпись интерфейса может просто лгать.Некоторые IDE будут копировать сигнатуру абстрактного / интерфейсного метода при вставке реализующего метода в подкласс.
Я не верю, что это имеет какое-либо значение для компилятора.
РЕДАКТИРОВАТЬ: Хотя я считаю, что это было правдой в прошлом, я не думаю, что текущие IDE делают это больше.
источник
static transient
полей. ;)Окончательные аннотации параметров метода всегда имеют отношение только к реализации метода, а не к вызывающему. Следовательно, нет реальной причины использовать их в сигнатурах метода интерфейса. Если вы не хотите следовать одному и тому же последовательному стандарту кодирования, который требует окончательных параметров метода, во всех сигнатурах метода. Тогда это приятно.
источник
Обновление: оригинальный ответ ниже был написан без полного понимания вопроса, и, следовательно, непосредственно не затрагивает вопрос.
:)
Тем не менее, он должен быть информативным для тех, кто хочет понять общее использованиеfinal
ключевого слова.Что касается вопроса, я хотел бы процитировать свой собственный комментарий ниже.
Я могу придумать две причины, по которым у сигнатуры метода могут быть
final
параметры: Бины и Объекты ( На самом деле, они обе являются одной и той же причиной, но немного различаются контекстами. )Объекты:
final
Ключевое слово гарантировало , что мы не случайно создать новый местный банк для приготовления пищи, показывая ошибку компиляции , когда мы пытались сделать это. Это обеспечило добавление куриного бульона в нашу оригинальную кастрюлю, которуюaddChicken
получил метод. Сравните это с тем,addVegetables
где мы потеряли цветную капусту, потому что это добавило это к новому местную кастрюлю вместо оригинальной кастрюли, которую она получила.Бобы: это та же концепция, что и объекты (как показано выше) . Бобы по сути
Object
s в Java. Однако bean-компоненты (JavaBeans) используются в различных приложениях в качестве удобного способа хранения и передачи определенной коллекции связанных данных. Подобно тому, какaddVegetables
можно испортить процесс приготовления пищи, создав новую кастрюлюStringBuilder
и выбросив ее вместе с цветной капустой, он также может сделать то же самое с кастрюлей JavaBean .источник
final
в интерфейсе, но сделать это не окончательным в реализации. Это имело бы больше смысла, если бы (а)final
ключевое слово не было разрешено для аргументов интерфейса (абстрактного) метода (но вы можете использовать его в реализации), или (б) объявление аргумента какfinal
в интерфейсе заставило бы его быть объявленнымfinal
в реализации (но не принудительно для нефиналов).:)
Я полагаю, что это может быть лишней деталью, так как окончательная или нет, это деталь реализации.
(Вроде как объявление методов / членов в интерфейсе как public.)
источник