Java でのカプセル化
Java のカプセル化は、オブジェクト指向プログラミング (OOP) の基本的な概念であり、データとそのデータを操作するメソッドを 1 つのユニット (Java ではクラスと呼ばれます) 内にバンドルすることを指します。 Java カプセル化は、クラスの実装の詳細を外部アクセスから隠し、クラスとの対話に使用できるパブリック インターフェイスのみを公開する方法です。
Java では、クラスのインスタンス変数をプライベートとして宣言することによってカプセル化が実現されます。これは、クラス内でのみアクセスできることを意味します。インスタンス変数への外部アクセスを許可するために、ゲッターとセッターと呼ばれるパブリック メソッドが定義されており、それぞれインスタンス変数の値を取得および変更するために使用されます。ゲッターとセッターを使用することにより、クラスは独自のデータ検証ルールを適用し、内部状態の一貫性を確保できます。
Java カプセル化の実装
以下は Java カプセル化を使用した例です。
ジャワ
// Java Program to demonstrate> // Java Encapsulation> // Person Class> class> Person {> > // Encapsulating the name and age> > // only approachable and used using> > // methods defined> > private> String name;> > private> int> age;> > public> String getName() {> return> name; }> > public> void> setName(String name) {> this> .name = name; }> > public> int> getAge() {> return> age; }> > public> void> setAge(> int> age) {> this> .age = age; }> }> // Driver Class> public> class> Main {> > // main function> > public> static> void> main(String[] args)> > {> > // person object created> > Person person => new> Person();> > person.setName(> 'John'> );> > person.setAge(> 30> );> > // Using methods to get the values from the> > // variables> > System.out.println(> 'Name: '> + person.getName());> > System.out.println(> 'Age: '> + person.getAge());> > }> }> |
出力
Name: John Age: 30
カプセル化 データを単一の単位にまとめることとして定義されます。これは、コードとコードが操作するデータを結び付けるメカニズムです。カプセル化についてのもう 1 つの考え方は、カプセル化は、このシールドの外側のコードがデータにアクセスするのを防ぐ保護シールドであるということです。
- 技術的には、カプセル化では、クラスの変数またはデータは他のクラスから隠蔽され、宣言されている独自のクラスのメンバー関数を通じてのみアクセスできます。
- カプセル化と同様に、クラス内のデータは、クラスのメンバーまたはメソッドをプライベートにすることで実現されるデータ隠蔽の概念を使用して他のクラスから隠蔽され、クラスは詳細を提供することなくエンドユーザーまたは世界に公開されます。抽象概念を使用した実装の背後にあるため、 データ隠蔽と抽象化の組み合わせ 。
- カプセル化は、クラス内のすべての変数をプライベートとして宣言し、変数の値を設定および取得するためのパブリック メソッドをクラス内に記述することで実現できます。
- これは、setter メソッドと getter メソッドを使用してより詳細に定義されます。
カプセル化の利点
- データの隠蔽: これは、実装の詳細を非表示にすることでデータ メンバーのアクセスを制限する方法です。カプセル化は、データを隠す方法も提供します。ユーザーはクラスの内部実装についてまったく知りません。クラスが変数に値をどのように格納しているかはユーザーには見えません。ユーザーは、値をセッター メソッドに渡し、変数がその値で初期化されていることだけを知ります。
- 柔軟性の向上: 要件に応じて、クラスの変数を読み取り専用または書き込み専用にできます。変数を読み取り専用にしたい場合は、上記のプログラムから setName()、setAge() などのセッター メソッドを省略する必要があります。変数を書き込み専用にしたい場合は、上記のプログラムから getName()、getAge() などのメソッドを取得します。
- 再利用性: カプセル化により再利用性も向上し、新しい要件に合わせて簡単に変更できます。
- コードのテストは簡単です。 カプセル化されたコードは、単体テストで簡単にテストできます。
- システムの詳細を実装する際のプログラマーの自由: これは、プログラマがシステムの詳細を自由に実装できるというカプセル化の大きな利点の 1 つです。プログラマに対する唯一の制約は、部外者が見ることができる抽象インターフェイスを維持することです。
例えば: テキスト エディタ GUI の編集メニュー コードのプログラマは、最初に、実際の画面イメージを外部バッファにコピーしたり、外部バッファからコピーしたりして、カット アンド ペースト操作を実装します。この実装では選択内容をコンパクトに保存できず、テキスト オブジェクトとグラフィック オブジェクトを区別できないため、後でユーザーはこの実装に不満を抱く可能性があります。プログラマがカプセル化を念頭に置いてカットアンドペーストインターフェイスを設計した場合、基礎となる実装を、テキストをテキストおよびグラフィックオブジェクトとして適切なコンパクト形式で保存する実装に切り替えることで、この GUI とインターフェイスする必要がある機能に問題が発生することはありません。 。したがって、カプセル化により、他の部分に悪影響を与えることなく、プログラムの一部の実装の詳細を変更できるため、適応性が得られます。
Java でのカプセル化の欠点
- 特に適切に使用しない場合、複雑さが増す可能性があります。
- システムがどのように機能するかを理解することがさらに難しくなる可能性があります。
- 実装の柔軟性が制限される可能性があります。
Java でのデータのカプセル化を示す例
例 1:
以下は、上記のトピックの実装です。
ジャワ
// Java Program to demonstrate> // Java Encapsulation> // fields to calculate area> class> Area {> > int> length;> > int> breadth;> > // constructor to initialize values> > Area(> int> length,> int> breadth)> > {> > this> .length = length;> > this> .breadth = breadth;> > }> > // method to calculate area> > public> void> getArea()> > {> > int> area = length * breadth;> > System.out.println(> 'Area: '> + area);> > }> }> class> Main {> > public> static> void> main(String[] args)> > {> > Area rectangle => new> Area(> 2> ,> 16> );> > rectangle.getArea();> > }> }> |
出力
Area: 32
例 2:
EncapsulateDemo クラスの変数にアクセスするプログラムを以下に示します。
ジャワ
// Java program to demonstrate> // Java encapsulation> class> Encapsulate {> > // private variables declared> > // these can only be accessed by> > // public methods of class> > private> String geekName;> > private> int> geekRoll;> > private> int> geekAge;> > // get method for age to access> > // private variable geekAge> > public> int> getAge() {> return> geekAge; }> > // get method for name to access> > // private variable geekName> > public> String getName() {> return> geekName; }> > // get method for roll to access> > // private variable geekRoll> > public> int> getRoll() {> return> geekRoll; }> > // set method for age to access> > // private variable geekage> > public> void> setAge(> int> newAge) { geekAge = newAge; }> > // set method for name to access> > // private variable geekName> > public> void> setName(String newName)> > {> > geekName = newName;> > }> > // set method for roll to access> > // private variable geekRoll> > public> void> setRoll(> int> newRoll) { geekRoll = newRoll; }> }> public> class> TestEncapsulation {> > public> static> void> main(String[] args)> > {> > Encapsulate obj => new> Encapsulate();> > // setting values of the variables> > obj.setName(> 'Harsh'> );> > obj.setAge(> 19> );> > obj.setRoll(> 51> );> > // Displaying values of the variables> > System.out.println(> 'Geek's name: '> + obj.getName());> > System.out.println(> 'Geek's age: '> + obj.getAge());> > System.out.println(> 'Geek's roll: '> + obj.getRoll());> > // Direct access of geekRoll is not possible> > // due to encapsulation> > // System.out.println('Geek's roll: ' +> > // obj.geekName);> > }> }> |
出力
Geek's name: Harsh Geek's age: 19 Geek's roll: 51
例 3:
上記のプログラムでは、変数がプライベートとして宣言されているため、クラス Encapsulate がカプセル化されます。 getAge()、getName()、getRoll() などの get メソッドは public として設定され、これらのメソッドはこれらの変数にアクセスするために使用されます。 setName()、setAge()、setRoll() などのセッター メソッドも public として宣言され、変数の値を設定するために使用されます。
以下は定義された例の実装です。
ジャワ
// Java Program to demonstrate> // Java Encapsulation> class> Name {> > // Private is using to hide the data> > private> int> age;> > // getter> > public> int> getAge() {> return> age; }> > // setter> > public> void> setAge(> int> age) {> this> .age = age; }> }> // Driver Class> class> GFG {> > // main function> > public> static> void> main(String[] args)> > {> > Name n1 => new> Name();> > n1.setAge(> 19> );> > System.out.println(> 'The age of the person is: '> > + n1.getAge());> > }> }> |
出力
The age of the person is: 19
例 4:
以下は Java カプセル化の実装です。
ジャワ
// Java Program to demonstrate> // Java Encapsulation> class> Account {> > // private data members to hide the data> > private> long> acc_no;> > private> String name, email;> > private> float> amount;> > // public getter and setter methods> > public> long> getAcc_no() {> return> acc_no; }> > public> void> setAcc_no(> long> acc_no)> > {> > this> .acc_no = acc_no;> > }> > public> String getName() {> return> name; }> > public> void> setName(String name) {> this> .name = name; }> > public> String getEmail() {> return> email; }> > public> void> setEmail(String email)> > {> > this> .email = email;> > }> > public> float> getAmount() {> return> amount; }> > public> void> setAmount(> float> amount)> > {> > this> .amount = amount;> > }> }> // Driver Class> public> class> GFG {> > // main function> > public> static> void> main(String[] args)> > {> > // creating instance of Account class> > Account acc => new> Account();> > // setting values through setter methods> > acc.setAcc_no(90482098491L);> > acc.setName(> 'ABC'> );> > acc.setEmail(> '[email protected]'> );> > acc.setAmount(100000f);> > // getting values through getter methods> > System.out.println(> > acc.getAcc_no() +> ' '> + acc.getName() +> ' '> > + acc.getEmail() +> ' '> + acc.getAmount());> > }> }> |
出力
90482098491 ABC [email protected] 100000.0