他の人が述べたように、プライベート変数は、オブジェクトを一貫性のない状態に陥らせるミス使用を避け、バグや予期しない例外を追跡するのが難しいのに適しています。
しかし他方では、他の人にほとんど無視されてきたのは、保護されたフィールドに関するものです。
拡張サブクラスは、保護されたフィールドへのフルアクセスを持ち、そのようなフィールドがパブリックであるかのようにオブジェクトを脆弱にしますが、その脆弱性は拡張クラス自体に制限されます(そのようなフィールドをさらに公開しない限り)。
そのため、パブリックフィールドを適切と見なすことは困難であり、現在のところ、それらを使用する唯一の理由は、構成パラメーターとして使用されるクラスのためです(多くのフィールドを持ち、ロジックを持たない非常に単純なクラスです。いくつかの方法)。
しかし一方で、プライベートフィールドは他のユーザーに対するコードの柔軟性を低下させます。
柔軟性とトラブル、長所と短所:
保護されたフィールドを持つバニラクラスのコードによってインスタンス化されたオブジェクトは安全であり、あなたの責任です。
一方、保護されたフィールドを使用してクラスを拡張するオブジェクトは、コードのユーザーによってインスタンス化され、ユーザーの責任ではなくユーザーの責任です。
したがって、十分に文書化されていない保護フィールド/メソッド、またはユーザーがそのようなフィールドとメソッドの使用方法を本当に理解していない場合、自分自身とあなたに不必要なトラブルを引き起こす可能性が十分にあります。
一方、ほとんどのものをプライベートにすると、ユーザーの柔軟性が低下し、物事が起こるようにするためだけにフォークを作成して維持したくない場合があるため、保守された代替手段を探すことさえできなくなります。
ですから、プライベート、保護、パブリックのバランスが本当に重要です。
ここで、プライベートと保護のどちらを選択するかが本当の問題です。
いつ保護を使用しますか?
フィールドが非常に柔軟であると理解するたびに、保護されているとコーディングする必要があります。その柔軟性は、nullになること(nullは常にチェックされ、例外をスローしない有効な状態として認識される)から、クラスexで使用される前に制約を持つことです。> = 0、<100など、値がオーバーフロー/アンダーフローに自動的に固定され、最大で警告メッセージがスローされます。
したがって、そのような保護されたフィールドでは、ゲッターを作成して(フィールド変数を直接使用するのではなく)それだけを使用できますが、他のユーザーはそれを使用しない可能性があります:負の値を拡張クラスで正常に機能させたい場合。