Обновление: оригинальный ответ ниже был написан без полного понимания вопроса, и, следовательно, непосредственно не затрагивает вопрос. :)Тем не менее, он должен быть информативным для тех, кто хочет понять общее использование finalключевого слова.
Что касается вопроса, я хотел бы процитировать свой собственный комментарий ниже.
Я считаю, что вы не обязаны реализовывать окончательность аргумента, чтобы вы могли свободно решать, должен ли он быть окончательным или нет в вашей собственной реализации.
Но да, звучит довольно странно, что вы можете объявить это finalв интерфейсе, но сделать это не окончательным в реализации. Это имело бы больше смысла, если бы:
а. finalключевое слово не было разрешено для аргументов интерфейса (абстрактного) метода (но вы можете использовать его в реализации), или
b. объявление аргумента как finalв interface заставит его быть объявленным finalв реализации (но не принудительным для нефинала).
Я могу придумать две причины, по которым у сигнатуры метода могут быть finalпараметры: Бины и Объекты ( На самом деле, они обе являются одной и той же причиной, но немного различаются контекстами. )
Объекты:
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где мы потеряли цветную капусту, потому что это добавило это к новому местную кастрюлю вместо оригинальной кастрюли, которую она получила.
Бобы:
это та же концепция, что и объекты (как показано выше) . Бобы по сути Objects в Java. Однако bean-компоненты (JavaBeans) используются в различных приложениях в качестве удобного способа хранения и передачи определенной коллекции связанных данных. Подобно тому, как addVegetablesможно испортить процесс приготовления пищи, создав новую кастрюлю StringBuilderи выбросив ее вместе с цветной капустой, он также может сделать то же самое с кастрюлей JavaBean .
finalвсе равно ничего не делает с нативными типами, так как они копируются.