Оновлення: Оригінальна відповідь нижче була написана без повного розуміння питання, а тому не стосується безпосередньо питання. :)
Тим не менш, вона повинна бути інформативною для тих, хто хоче зрозуміти загальне використання final
ключового слова.
Щодо питання, я хотів би процитувати власний коментар знизу.
Я вважаю, що ви не змушені застосовувати остаточний аргумент, щоб ви могли вирішити, чи він повинен бути остаточним чи ні у вашій власній реалізації.
Але так, це здається дивним, що ви можете оголосити це final
в інтерфейсі, але мати його не остаточним у реалізації. Було б більше сенсу, якби:
а. final
ключове слово не було дозволено для аргументів методу інтерфейсу (абстрактних) (але ви можете використовувати його в реалізації), або
b. Оголошення аргументу як final
інтерфейсу змусило б його оголосити final
у впровадженні (але не вимушено для нефіналу).
Я можу подумати про дві причини, за якими підпис методу може мати final
параметри: Beans and 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. Однак квасоля (JavaBeans) використовується в різних додатках як зручний спосіб зберігання та передачі певного збору пов'язаних даних. Так само, як addVegetables
міг зіпсувати процес приготування, створивши новий котел для готування StringBuilder
і викинувши його з цвітною капустою, він також міг би зробити те ж саме з варом для готування JavaBean .
final
так чи інакше нічого не роблять із рідними типами, оскільки вони скопійовані.