OOPシリーズ: Javaでのカプセル化



導入
カプセル化はオブジェクト指向プログラミング(OOP)の4つのコア原則のうちの1つです.情報隠蔽とも呼ばれる.カプセル化とは、このデータを操作する方法と共にデータのパッケージングまたはバンドルを意味し、それによってデータへの直接外部アクセスを制限する.これらのデータは、通常、クラスの内部でプライベートアクセスが宣言された変数と、変数の値を更新して取得するために使用できるsettersメソッドとgettersメソッドの形式です.

カプセル化の例は、薬カプセルから見ることができます.ここでは、カプセルはコンテンツを直接外部から保護します.カプセルを取る前に、我々はほとんどその内容を見るためにそれを開けません、しかし、我々が我々が何が内部であるかについてわからないという事実に関係なく、そして、それがその機能性を始めると思っているという事実に関係なく、それの全体をとってください.この場合、カプセルが私たちから内容をカプセル化したと言うのは安全です.これは同じクラスです.外部からのアクセスやクライアントからのアクセスを保護します.この場合、クライアントはそれらに直接のアクセスを持っていないので、クライアントはこの情報を操作することができません、そして、彼らはよくそのクラスから作成されるオブジェクトの内部の仕事または実装を見ることができません.

内容
  • 背景知識
  • カプセル化を使用する利点
  • 口座クラス
  • AccountTestクラス
  • 結論

  • 期待
    この記事の最後までに、
  • カプセル化が何であるかについての高い知識を持っています.
  • カプセル化を使用する利点のいくつかを知っています.
  • カプセル化の概念を適用する単純なJavaアプリケーションを記述します.

  • 背景知識
    この記事はOOPのコア原則の1つのハイレベルの概観を与えます.以下のようなOOPの基本的な知識があります.
  • オブジェクト
  • クラスとメソッド
  • 遺産
  • 相続に関する記事をチェックしてください.

    カプセル化を使用する利点
  • データ隠し:フィールド宣言のプライベートアクセス修飾子を使用すると、外部のソースからそのフィールドをそのフィールドに保護します.したがって,情報漏洩を恐れずに重要な情報を蓄積することができる.
  • コントロール:クラス内のプライベートフィールドにアクセスするためのセッターメソッドとゲッターメソッドの使用は、その変数をより多くのコントロールにします.仮定するsetBalance アカウントクラスのメソッドは、正の値のみを処理し、負の値をゼロに設定し、ユーザーが負の値にアカウントのバランスを設定したい場合は、このメソッドで行われた検証のため、負の値の代わりにゼロに格納されます.
  • 例外を減らします:ユーザーが名前フィールドで彼らの年齢に入ると仮定してくださいString 価値は期待されるが、それはint 値.カプセル化を行うと、例外のためにプログラムを終了するのではなく、正規表現の単純なif - elseステートメントを使用して入力を検証し、例外を処理することで回避できます.

  • 口座クラス
    アカウントクラスはアカウントに関連する情報を含む銀行口座を表します.このクラスは、カプセル化の仕組みとその利点を示すために使用されます.
    package Encapsulation;
    
    public class Account {
    
        private String firstName, lastName;
        private double balance;   
    
        // set and get methods
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setBalance(int balance) {
            // handles invalid balance
            if (balance >= 0.0)
                this.balance = balance;
            else 
                this.balance = 0.0;
        }
    
        public double getBalance() {
            return balance;
        }
    
        @Override
        public String toString() {
            return String.format("%s%n%s: %s%n%s: %s%n%s: %.2f%n", 
                    "Account Info", "First Name", getFirstName(),
                    "Last Name", getLastName(), "Balance", getBalance());
        }
    
    }
    
    上記のAccountクラスは、インスタンスフィールドのすべてを宣言し、これらのフィールドのアクセスを制限します.
        private String firstName, lastName;
        private double balance; 
    
    この場合、クラスのオブジェクトでさえカプセル化されるので、これらのプライベートフィールドにアクセスできません.クラスの内部で宣言されたpublic get setメソッドを通してのみアクセスできます.より堅牢なシステムでは、セットメソッドは通常、外部の値がそれらを設定する前に通過しなければならない複雑な検証を行いますが、この記事と単純さのために、if - elseステートメントを使用して、ユーザーが入力したバランスを検証します.
    The setBalance 最初に、バランスが正の数であるかどうかをチェックします(ほとんどの場合負のバランスがないので).しかし、預金方法は、それが有効であるならば、預金額を前のバランスに加えます(預金額はほとんど正の値です).
    public void setBalance(int balance) {
            // handles invalid balance
            if (balance >= 0.0)
                this.balance = balance;
            else 
                this.balance = 0.0;
        }
    
    会計士が誤って預金のために負の量を入力する状況では、通常、プログラムは以前のバランス左から減算したが、カプセル化のために、この種の微妙なエラーを処理する実装がプログラムに加えられたので、これはそうではありません.
    アカウントクラスの別の実装はtoString そのクラスのオブジェクトの文字列表現を表示するメソッドです.
      @Override
        public String toString() {
            return String.format("%s%n%s: %s%n%s: %s%n%s: %,.2f%n", 
                    "Account Info", "First Name", getFirstName(),
                    "Last Name", getLastName(), "Balance", getBalance());
        }
    
    このメソッドはtoString から継承するメソッドObject クラスを実装し、実装を追加します.この利点はこの記事の後半で見られる.

    AccountTestクラス
    AccountTestクラスはAccountクラスのオブジェクトを含み、Accountクラスの機能をテストするために使用します.
    package Encapsulation;
    
    public class AccountTest {    
        public static void main(String[] args) {
            Account clerk = new Account();
            clerk.setFirstName("Clark");
            clerk.setLastName("Tom");
            clerk.setBalance(-200);
    
            // Before depositing
            System.out.println(clerk);
    
            // After depositing invalid amount
            clerk.deposit(-400);
            System.out.printf("AFter depositing invalid amount %nBalance: %,.2f%n",
                    clerk.getBalance());
    
            // After depositing valid amount
            clerk.deposit(1500);
            System.out.printf("AFter depositing valid amount %nBalance: %,.2f%n",
                    clerk.getBalance());
        }
    } 
    
    AccountTestクラスの主メソッドは、Accountクラスのオブジェクトを作成し、Setメソッドを使用してオブジェクトの値を初期化します.
    下のイメージは、Accountクラスのプロパティのすべてを示します.下のイメージから見ると最初の名前、最後の名前、およびアカウントの残高は、プライベートで宣言されているため、ユーザーには表示されません.これらのメソッドは、publicメソッドで宣言されたGETメソッドを通してのみアクセスできます.

    名前を設定した後、オブジェクトは、アカウントの残高として負の量を設定しようとします
    clerk.setBalance(-200);
    
    しかし、アカウントのクラスが自動的に負の金額をアカウント残高で0.0に受け取ったことを思い出してください.カプセル化は、我々が正常にいくつかの実装を加えたので、ここで仕事で見られますsetBalance ユーザーに表示されないメソッドです.
    また、clerk オブジェクトは、オブジェクト変数を単独で使用してコンソールに表示されます.
    System.out.println(clerk);
    
    我々がオブジェクトをきちんと表示するのを助けるどんなメソッドでもないというのに注意してください、しかし、それは単独で可変ですtoString アカウントクラスのメソッド.ユーザーは、すでに処理されているので、出力をフォーマットしようとするというストレスを通過する必要はありません.
    次のステートメントは、ユーザーのアカウントに負の量を預金しようとし、新しいバランスを印刷します.
    clerk.deposit(-400);
    
    バランスメソッドと同様に、負の値が堆積されることはできません.したがって、プログラムは、この無効な預金額を前のバランスに追加します.
    次のステートメントは、ユーザーのアカウント残高に有効な金額を預金する.この場合、妥当性が検証され、妥当性検査に合格したので、残額にバランスを加えて、新しいバランスを表示する.
    clerk.deposit(1500);
    
    以下のイメージはAccountTestクラスのAccountTestクラスの出力を示します.ジャバ.ユーザーが無効なバランスをセットしようとするとき、それはアカウントの初期の状態から成ります.そして、ユーザが有効量を入力する.


    結論
    この記事は、薬カプセルを例としてカプセル化の概念を導入することから始めます.ここで使用できる別の例は、自動車のインスタンスです.車は少なくともブレーキとアクセルを持っています、運転者はこれらの2つを使います.ほとんどの時間ドライバーがこれらのことがどのように車を使う前に働くかについて知る必要がないので、彼らの機能はドライバーから隠されます.カプセル化の別の良い例です.
    私たちはカプセル化のいくつかの利点を挙げました、そこに多くの他の利点があります、しかし、我々はこの記事のために少しの重要なものだけを選びました.
    次に、アカウントクラスを使用して、コード例を使用して適切に概念を説明します.
    カプセル化はプログラミングの幅広い概念です、そして、実装はそれをサポートする異なったプログラミング言語の上でわずかに異なります.javaを用いたカプセル化の基本的な実装を示した.