finalとオブジェクトの不変性


final


:最後の、変更不可

変数を使用する場合


  • 変更できない定数になります.
    定数なので宣言と同時に初期化します.
    静的値が変更されても、常に同じ値を共有する最終値を入力します.

  • または、インスタンス変数の場合、ジェネレータで初期化できます.
    (定数ですが、宣言後、ジェネレータは一度だけ初期化されます)
    (この機能を使用すると、各インスタンスにfinalのメンバー変数値が異なる→各作成者を呼び出すことができます)
  • public class Shop{
    
      final int closeTime = 21;  //final 필드에 값을 저장하는 방법1 : 선언과 함께 초기화
      final int openTime;        //final 필드에 값을 저장하는 방법2 : 선언후 생성자에서 초기화
    
      public Shop(int openTime){
        this.openTime = openTime;
      }
    }

    オブジェクトを使用する場合

    finalキーワードは値を変更できませんが、オブジェクトの場合は少し異なります.
    オブジェクトArrayListがあれば、値を変更できます.
    これはfinal(定数)リストがArrayList値を持たず、ArrayListオブジェクトのアドレスを参照するためである.
    したがってfinalキーワードとしてArrayListのアドレスは変更できない.
    最終的には、Collectionではfinalは追加または削除できないのではなく、再割り当てできません.

    では、第1のCollectionにはなぜ物語があるのでしょうか。


    オブジェクト向けの観点から,これらのオブジェクトの値が変化しないことを保証し,コードを修正する側効果を最小限に抑える必要がある.
    しかし、Collectionではfinalは、価格が変わらないのではなく、再配分は不可能だと述べた.
    したがって、First Class CollectionによりCollectionに不変性が付与される.[一級コレクションは?]
    public class Cars {
        private final List<Car> cars = new ArrayList<>();
        
        //가능 (객체 필드(속성)는 변경이 가능함)
        cars.add("AAA");
        cars.add("BBB");
        cars.get(0).change("CCC");
        
        //불가능 (다른 객체로 변경 할 수 없음 = 참조값 변경 불가)
        cars = new ArrayList<>();
    }

    メソッド使用時

  • オーバーライド率で再定義できません.
  • クラスで使用する場合

  • はクラスを継承し、自分のサブクラスを定義できません.
  • static final

    static final="共通/固定"+"最終"
  • 2finalでは、コンストラクション関数で初期化された場合、各オブジェクトは異なる値を有することができる.従ってfinal自体だけが完全な定数を意味するわけではない.
  • ただし、staticが貼り付けられている場合は、変数(メモリ内の一意の変数)が共有されています.
    オブジェクトごとに異なる値は指定できません.+finalも変更できません.
  • タスクフィードバックの表示



    [参考]
    https://gobae.tistory.com/3
    https://m.blog.naver.com/kiho0530/150143859108
    https://advenoh.tistory.com/13