更新:以下の元の回答は質問を完全に理解せずに書かれたため、質問に直接対応していません。:)それにもかかわらず、finalキーワードの一般的な使用法を理解したいと考えている人にとって有益なものでなければなりません。
質問は、下から自分のコメントを引用したいと思います。
私は、あなたがあなた自身の実装においてそれが最終的であるかどうかを決定する自由をあなたに残すために、議論の最終性を実装することを強いられていないと信じています。
しかし、はい、finalインターフェイスで宣言できるのは奇妙に聞こえますが、実装ではそれを非最終的なものにします。次のいずれかである場合、より理にかなっています。
a。 finalキーワードは、インターフェース(抽象)メソッドの引数には許可されていません(ただし、実装で使用できます)、または
b。finalインターフェースのように引数を宣言するとfinal、実装で強制的に宣言されます(ただし、非最終の場合は強制されません)。
メソッドシグネチャがfinalパラメータを持つことができる2つの理由を考えることができます:Beansとオブジェクト(実際には、両方とも同じ理由ですが、コンテキストがわずかに異なります。)
オブジェクト:
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カリフラワーを失った場所と比較してください。カリフラワーが元の鍋ではなく、新しい地元の調理鍋に追加されたからです。
Beans:
これはオブジェクトと同じ概念です(上記を参照)。Beanは基本的ObjectにJavaではです。ただし、Bean(JavaBeans)は、関連するデータの定義されたコレクションを格納して渡すための便利な方法として、さまざまなアプリケーションで使用されます。がaddVegetables新しいクッキングポットStringBuilderを作成してカリフラワーと一緒に捨てることでクッキングプロセスを台無しにするのと同じように、クッキングポットJavaBeanでも同じことができます。
finalネイティブ型はコピーされるため、とにかく何もしません。