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