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
="共通/固定"+"最終"final
では、コンストラクション関数で初期化された場合、各オブジェクトは異なる値を有することができる.従ってfinal自体だけが完全な定数を意味するわけではない.static
が貼り付けられている場合は、変数(メモリ内の一意の変数)が共有されています.オブジェクトごとに異なる値は指定できません.+
final
も変更できません.タスクフィードバックの表示
[参考]
https://gobae.tistory.com/3
https://m.blog.naver.com/kiho0530/150143859108
https://advenoh.tistory.com/13
Reference
この問題について(finalとオブジェクトの不変性), 我々は、より多くの情報をここで見つけました https://velog.io/@yyy96/finalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol