Обновление: Первоначальный ответ ниже был написан без полного понимания вопроса, и, следовательно, непосредственно не затрагивает вопрос :)
Тем не менее, он должен быть информативным для тех, кто хочет понять общее использование final
ключевое слово.
Что касается вопроса, я хотел бы процитировать свой собственный комментарий ниже.
Я полагаю, что вы не обязаны реализовывать окончательность аргумента, чтобы оставить вас свободными решать, должен ли он быть окончательным или нет в вашей собственной реализации.
Но да, это звучит довольно странно, что вы можете объявить это final
в интерфейсе, но иметь это не финальное в реализации. Это имело бы больше смысла, если бы:
a. final
недопустимо ключевое слово для аргументов интерфейсного (абстрактного) метода (но вы можете использовать его в реализации), или
b. объявление аргумента как final
в интерфейсе вынудит его объявить final
в реализации (но не принудительно для нефиналов).
Я могу представить себе две причины, по которым сигнатура метода может иметь final
параметры: Beans и Objects ( На самом деле, они обе являются одной и той же причиной, но немного разные контексты. )
Объекты:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
// ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth
// We forgot to add cauliflower. It went into the wrong pot.
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
// ^--- Assignment allowed...
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
//cookingPot = new StringBuilder(cookingPot.toString());
// ^---- COMPILATION ERROR! It is final.
cookingPot.append("ChickenBroth ");
}
Ключевое слово final
гарантировало, что мы не будем случайно создавать новую локальную кастрюлю, показывая ошибку компиляции, когда мы пытались это сделать. Это обеспечило добавление куриного бульона в нашу оригинальную кастрюлю, полученную методом addChicken
. Сравните это с addVegetables
, где мы потеряли цветную капусту, потому что она добавила это в новый местный кастрюлю вместо оригинального кастрюли, которую он получил.
Фасоль:
Это та же концепция, что и у объектов (как показано выше) . Бины по сути Object
с в Java. Однако bean-компоненты (JavaBeans) используются в различных приложениях в качестве удобного способа хранения и передачи определенного набора связанных данных. Точно так же, как addVegetables
может испортить процесс приготовления, создав новую кастрюлю StringBuilder
и выбросив ее вместе с цветной капустой, он также может сделать то же самое с кастрюлей JavaBean .