| English | 意味 |
|---|---|
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | カプセル化 |
| instance variables/ˈɪnstəns ˈveərɪəblz/ | インスタンス変数 |
プライベートフィールドには検証用メソッドが必要です
- Student はプライベートなスコアを持っていますが、
public void setScore(int s) { score = s; }が呼び出し元に -5 を提供することを許容します。プライベートアクセスだけでは非負のスコア強制は行われません。 - ガーデンドセットメソッドはその更新を拒否できます。コンストラクタと、そのフィールドに書き込む他のすべてのメソッドも確認してください。カプセル化は検証ポリシーを強制しやすくしますが、自動的に生成するものではありません。
score を private にすると、ガードのない public セッターに渡される負の引数が自動的に拒否されます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
誤り:セッターはクラス内のコードであり、負の値を代入できます。検証ロジックを実装する必要があります。
クラスの3つの構成要素
- ここでのクラス設計は、データのためのインスタンスフィールド、初期化のためのコンストラクタ、そして振る舞いのためのメソッドを含んでいます。これらは識別すべき3つの有用な部分であり、形式的にはJavaにおいてコンストラクタはクラスメンバーに分類されません。
- コンストラクションから更新までのStudentを追跡します:コンストラクタはスコアフィールドを初期化し、後でインスタンスメソッドがそのオブジェクトのスコアを読み取りまたは変更します。一方、スタティックメソッドには暗黙的な現在オブジェクトはありません。
インスタンス変数が状態を保持する
- インスタンス変数は各オブジェクト独自の状態を格納します。
private String name; private int score;—— クラス内で宣言され、どのメソッドの外側にある。- 各オブジェクトに独自のコピーが割り当てられる——一人の学生の
scoreは他とは独立している。 - これらはオブジェクトの寿命の間持続します(ローカル変数とは異なります)。
privateとpublic
- アクセス修飾子は、誰がメンバーにアクセスできるかを制御します。
private— クラス内部でのみ使用可能;public— クラスにアクセスできる他のコードに対して公開されます。- インスタンス変数は通常**
privateであり、インターフェースを形成するメソッドはpublic**です。 - 内部データの隠蔽をエンカプゼーションと呼びます。
ここで習う Student クラスの設計を構成する3つの部分は何ですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
インスタンス変数は状態を保持し、コンストラクタは新しいオブジェクトを初期化し、メソッドは振る舞いを提供します。Javaの用語において、コンストラクタは形式的なクラスメンバーではありません。
インスタンス変数は通常...声明されます
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
プライベートデータ+パブリックメソッド=カプセル化。
データをプライベートに保ち、メソッドを通じてのみ公開することを ___ (単語1つ)と呼びます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
カプセル化はオブジェクトのデータを保護します。
同じクラスの2つのオブジェクトは、各インスタンス変数の1つのコピーを共有します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
各オブジェクトはインスタンス変数の独自のコピーを持ちます。
ここに示した上位の Student クラスにおいて、無関係な外部クラスが private 変数を直接読み取ることが...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
privateアクセスにより、無関係な外部クラスがその変数を直接読み取ることを防げます。Student 内部のコードは、別の Student オブジェクトの private 変数を読み取ることができます。
なぜデータをprivateにするのか
- カプセル化は、無関係な外部コードがプライベートフィールドに直接割り当てるのを防ぎます。Student内のコードは、明示的に参照された別のStudentのフィールドを含む、プライベートフィールドの読み書きが可能です。
- 外部者はパブリックメソッドを通じてのみ相互作用でき、ここで検証とアクセス制御が可能です。
- メソッド内で負の得点を拒否できますが、パブリック変数にはそのようなガードがありません。
- 意図的に選択されたパブリックインターフェースを持つプライベートフィールドは、制御された更新をサポートします。各メソッドとコンストラクタは、意図したルールを実装している必要があります。可変な内部オブジェクトを返すことも、間接的に変更を暴露することがあります。
インスタンス変数を private に保ち、public メソッドを通じて振る舞いを公開してください。 public フィールドであれば、任意のコードがチェックなしで任何东西(負のスコア、nullの名前など)に設定できます。カプセル化は、変更を検証できるメソッドを通じてすべてのアクセスを誘導します。各オブジェクトは独立したインスタンスフィールドストレージを持ちますが、異なるオブジェクトの参照フィールドは同じ共有オブジェクトを指すことがあります。独立したフィールドと独立して参照されるオブジェクトを区別してください。
2つのオブジェクトには個別の参照フィールドがあるため、それらのフィールドは異なるオブジェクトを指している必要があります。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
誤り:個別の参照フィールドが同じ可変オブジェクトを指すことができます。
2人の学生が同じ initially empty な ArrayList を参照しています。片方が1つのアイテムを追加しました。もう片方が参照するリストのサイズはいくらになりますか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
両方の参照は同じリストオブジェクトを指しており、そのサイズは現在 1 です。
Student クラスの解剖学:
- インスタンス変数:
private String name; private int score; - コンストラクタ:
public Student(String n) { ... } - メソッド:
public void addScore(int s) { ... }、public int getScore() { ... }
フィールドストレージと共有オブジェクトを分離する
- 2つのStudentオブジェクトが同じArrayListへの参照を保持する場合、それらのリストフィールドは独立していますが、参照先のリストは共有されています。どちらの参照を通じてアイテムを追加しても、その1つのリストが変更されます。
- 一人の学生のリストフィールドを新しいArrayListに再割り当てすると、そのフィールドのみが変化します。状態を予測する際は参照矢印をたどってください。プライベートアクセスとオブジェクトの同一性は異なる質問に答えます。
クラスにはインスタンス変数(各オブジェクトの状態)、コンストラクタ(新しいオブジェクトのセットアップ)、そしてメソッド(振る舞い)があります。インスタンス変数は通常**privateであり、public** メソッドを通じてアクセスされます—このカプセル化がデータを保護しています。各オブジェクトは独立したインスタンスフィールドを持ちますが、それらのフィールドによって参照されるオブジェクトは依然として共有されている可能性があります。
各オブジェクトは独自の状態を持ちます
a.score と b.score は別々であり、各オブジェクトが自身の状態を所有しています。