Java カプセル化


オブジェクト指向プログラミング手法において、カプセル化(英語:Encapsulation)とは、抽象的な関数インターフェースの実装詳細部分を包み込み、隠す方法のことを指します。

カプセル化は、そのクラスのコードとデータが外部クラスで定義されたコードによってランダムにアクセスされるのを防ぐ保護バリアと考えることができます。

そのクラスのコードとデータにアクセスするには、厳密なインターフェース制御を通さなければなりません。

カプセル化の最も主要な機能は、自分の実装コードを変更しても、私たちのコードを呼び出すプログラムの断片を変更する必要がないことです。

適切なカプセル化により、プログラムコードはより理解しやすく保守しやすくなり、コードの安全性も強化されます。

カプセル化の利点

  • 1. 適切なカプセル化は結合度を減らすことができます。

  • 2. クラス内部の構造は自由に変更できます。

  • 3. メンバー変数をより精密に制御できます。

  • 4. 情報を隠し、実装の詳細を隠蔽します。


Javaカプセル化を実装する手順

1. 属性の可視性を変更して属性へのアクセスを制限します(通常はprivateに制限します)。例:

public class Person { private String name; private int age; }

このコードでは、nameとage属性をprivateに設定することで、このクラスだけがアクセスでき、他のクラスはアクセスできません。これにより情報が隠蔽されます。

2. 各値属性に対して外部向けのパブリックメソッドアクセスを提供します。つまり、プライベート属性へのアクセス用に、値を設定・取得するメソッドのペアを作成します。例:

public class Person{ private String name; private int age; ​ public int getAge(){ return age; } ​ public String getName(){ return name; } ​ public void setAge(int age){ this.age = age; } ​ public void setName(String name){ this.name = name; } }

使用するthisキーワードは、インスタンス変数(private String name)とローカル変数(setName(String name)内のname変数)の間で発生する同名の衝突を解決するためのものです。


例

Javaカプセル化クラスの例を見てみましょう:

EncapTest.java ファイルコード:

/*ファイル名: EncapTest.java*/ public class EncapTest{ private String name; private String idNum; private int age; public int getAge(){ return age; } public String getName(){ return name; } public String getIdNum(){ return idNum; } public void setAge( int newAge){ age = newAge; } public void setName(String newName){ name = newName; } public void setIdNum( String newId){ idNum = newId; } }

上記の例では、publicメソッドは外部クラスがこのクラスのメンバー変数にアクセスするための入り口です。

通常、これらのメソッドはgetterおよびsetterメソッドと呼ばれます。

したがって、クラス内のプライベートメンバー変数にアクセスしたいクラスは、これらのgetterおよびsetterメソッドを通さなければなりません。

以下の例を通して、EncapTestクラスの変数がどのようにアクセスされるかを説明します:

RunEncap.java ファイルコード:

/*ファイル名 : RunEncap.java*/ public class RunEncap{ public static void main(String args[]){ EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms"); System.out.print("Name : " + encap.getName()+ " Age : "+ encap.getAge()); } }

上記のコードをコンパイルして実行した結果は以下のとおりです:

Name : James Age : 20
その他の拡張