finalはJavaで以下のように使用されます:
特性と細かい点:
final変数は宣言時またはコンストラクタ内で初期化する必要があります;final参照は参照を変更できませんが(immutableでない場合)、参照先のオブジェクトは変更できます;finalクラス(例えば、String、Math)からの継承は不可能;finalメソッドはオーバーライドできません、たとえクラスが継承可能であっても。final class A {} // class B extends A は不能 class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // エラー: fooをオーバーライドできない } final int COUNT = 10;
final変数が参照しているオブジェクトの状態を変更できますか?
回答: はい、immutableオブジェクトでない場合です。例えば:
final List<String> names = new ArrayList<>(); names.add("Vasya"); // 許可されている — 参照に従ったオブジェクトは変更されるが、参照自体は変わらない names = new ArrayList<>(); // コンパイルエラー
物語
物語
物語
finalクラスに基づいた外部APIを拡張する必要が生じました。それらのため、拡張が不可能になり、ロジックを複製し、二つの独立した製品のブランチを維持する必要があり、移行が難しくなりました。