java composition what is composition java
このJavaコンポジションチュートリアルでは、Javaのコンポジションとアグリゲーションとは何か、およびそれらの違いについて説明します。
最後の数回のチュートリアルでは、Javaでの継承について詳しく説明しました。 Javaでの継承は、あるオブジェクトが別のオブジェクトの「一種」であることを示す一種の「IS-A」関係です。 例えば、 車は車の種類または種類です。
オブジェクト指向プログラミングは、「HAS-A」関係と呼ばれる別のタイプの関係を提供します。このチュートリアルでは、has-a関係について詳しく説明します。
=> ゼロからJavaを学ぶには、ここにアクセスしてください。
学習内容:
Javaコンポジションチュートリアル
Javaの「has-a」関係は 組成 。 「has-a」関係または構成を使用することにより、プログラムでのコードの再利用性を保証します。
したがって、プログラムに「has-a」関係を使用させることにより、ここで行っているのは、継承の場合のように別のクラスから「拡張」するのではなく、クラスのインスタンスを直接使用するようにすることです。
次の図は、Javaの「is-a」と「has-a」の両方の関係を示しています。
上の図からわかるように、車は車両であるため、車と車両は「IS-A」の関係を共有しています。したがって、既存の車両オブジェクトにさらに特性を追加して、車両オブジェクトを作成します。
この図では、車とエンジンは「Has-a」の関係を共有しています。車には常にエンジンがあります。したがって、ここで行うことは、Engineオブジェクトのプロパティを拡張するのではなく、Engineオブジェクトを直接使用することです。これは、Javaで合成を使用して行われます。
したがって、カプセル化、抽象化、およびポリモーフィズムとともに、継承と構成もオブジェクト指向プログラミング(OOP)の重要な機能です。
「has-a」関係は通常、特定のオブジェクトに別のオブジェクトがあるかどうかを決定します。したがって、ここで行うことは、オブジェクトを再利用して、コードの重複とエラーを減らすことです。これは、クラスで完全に開発およびテストされたオブジェクトを使用しているためです。
まず、Javaの「関連付け」と呼ばれる特別な関係について説明します。この関係から、構成やその他の関係を導き出します。
Javaでの関連付け
Javaでの関連付けは、別々のオブジェクトを使用して2つの個別のクラス間に存在する関係として定義できます。 Javaでの関連付けには、次の関係があります。
- 1対1: 正確に1つのオブジェクトに関連付けられた1つのオブジェクト。
- 1対多: 1つのオブジェクトを多くのオブジェクトに関連付けることができます。
- 多対1: 多くのオブジェクトを1つのオブジェクトに関連付けることができます。
- 多対多: 複数の他のオブジェクトに関連付けられた複数のオブジェクト。
関係が確立されると、含まれているオブジェクト(他のオブジェクトをメンバーとして持つオブジェクト)は、含まれているオブジェクトと通信して、プロパティと特性を再利用します。アソシエーションには、コンポジションとアグリゲーションの2つの形式があります。
次の図はこれを示しています。
上の図からわかるように、関連付けには構成と集約が含まれます。構成はより具体的な用語であり、集約は構成よりも一般的です。これらのフォームは、サポートする関係のタイプに基づいています。
コンポジションとアグリゲーションに進む前に、Javaプログラムを実装してJavaでの関連付けを示しましょう。
import java.io.*; // class Account class Account { private String bank_name; private long Account_number; // initialize bank name and account number Account(String bank_name, long Account_number) { this.bank_name = bank_name; this.Account_number = Account_number; } //read bank name public String getBankName() { returnthis.bank_name; } //read account number public long getAccountNumber() { returnthis.Account_number; } } // employee class class Employee { private String emp_name; // initialize employee name Employee(String emp_name) { this.emp_name = emp_name; } //read employee name public String getEmployeeName() { return this.emp_name; } } // Associate both the classes class Main { public static void main (String() args) { Employee emp = new Employee('Andrew'); Account acc = new Account('Citi Bank', 13319); System.out.println(emp.getEmployeeName() + ' has an account with ' + acc.getBankName() + ' with Account Number:' + acc.getAccountNumber()); } }
出力:
上記のプログラムは、Javaでの関連付けを示しています。ここに、プライベートメンバーとして銀行名と口座番号を持つクラスAccountがあります。次に、Employeeクラスがあります。すべての従業員が給与などを預けるための口座番号を持っていることを私たちは知っています。
つまり、従業員の銀行口座の詳細を読み取るための別のクラスまたはメソッドを作成する代わりに、既存のAccountクラスを直接再利用します。つまり、AccountオブジェクトをEmployeeに関連付けて、従業員の銀行口座の詳細を取得します。上記の例はまさにこれを行います。
Javaでの構成
構成は、関連付けの1つの形式です。構成は、あるクラスに別のクラスが含まれ、この含まれるクラスが独立して存在できないように含まれるクラスに依存する関連付けとして定義できます。
上記の関係の例を見てきました。その中に、エンジンを搭載した車のオブジェクトがありました。これは構成の例です。この中で、エンジンは車なしでは独立して存在することはできません。
集計と比較すると、構成はより制限されています。構成はJava機能ではありません。これは主に設計手法と見なされます。
次の図は、構成例を示しています。
テスターのためのSQLクエリインタビューの質問
この場合、従業員は銀行口座を持っています。銀行口座は口座名義人なしでは存在できないことを私たちは知っています。アカウント所有者がいないと、休止状態になります。
コンポジションを使用して、他のオブジェクトをメンバーとして持つオブジェクトをモデル化できます。これらのオブジェクトは、それらの間で「has-a」関係にあります。
コンポジションでは、オブジェクトは別のオブジェクトに含まれているため、含まれているオブジェクトが破棄された場合。他のオブジェクトも破壊されます
したがって、構成関係は、「全体の一部」の関係と見なすことができます。 部 なしでは存在しません 全体 。したがって、全体が破壊されると、その部分も削除されます。これは、全体が部分とより強い関係を持っていることを意味します。
Java構成の例
以下に、構成を示すプログラムを示します。
ここで使用したシステムは次のとおりです。
したがって、このプログラムには、上記の3つのクラスがあります。ホンダは車なので、クラスカーから拡張されます。 CarEngineオブジェクトはホンダクラスで使用されます。
プログラムは以下のとおりです。
class CarEngine { public void startEngine(){ System.out.println('Car Engine Started.'); } public void stopEngine(){ System.out.println('Car Engine Stopped.'); } } class Car { private String color; private int max_Speed; public void carDetails(){ System.out.println('Car Color= '+color + '; Max Speed= ' + max_Speed); } //set car color public void setColor(String color) { this.color = color; } //set car max_Speed public void setMaxSpeed(int max_Speed) { this.max_Speed = max_Speed; } } class Honda extends Car{ public void HondaStart(){ CarEngine Honda_Engine = new CarEngine(); //composition Honda_Engine.startEngine(); } } public class Main { public static void main(String() args) { Honda HondaCity = new Honda(); HondaCity.setColor('Silver'); HondaCity.setMaxSpeed(180); HondaCity.carDetails(); HondaCity.HondaStart(); } }
出力:
したがって、出力はホンダ車の特性を示しています。また、compositionを使用してHondaクラスのメンバーとして使用したCarEngineクラスからのメソッドの出力も示しています。
このプログラムは、Javaプログラムでコンポジションを使用する方法を示しました。
Javaでの集約
集約は、Javaの関連付けのもう1つの形式です。ただし、集約の場合は、オブジェクト間の一方向の関係のみが許可されます。 例えば、 従業員は自宅の住所を持っています。しかし、その逆に、自宅の住所には従業員がいて、正しく聞こえません。
同様に、学生には住所がありますが、「住所には学生がいます」は意味がありません。コンポジションと同様に、集約も「has-a」関係を表します。これは、クラスに別のクラスのオブジェクトが含まれていることを意味します。
次の図は、集約の例を表しています。
上記の例は、大学にスタッフと学生がいると解釈できます。
では、いつ正確にアグリゲーションに行くべきでしょうか?
「is-a」関係や継承を使用する必要がない場合は、集計を使用する必要があります。アプリケーション全体またはオブジェクトの存続期間を通じて「is-a」関係を維持できる場合は、コードを再利用するための継承を実装できます。
それ以外の場合は、コードの再利用性のために集計を使用するのが最善です。次に、Javaで集約の例を実装しましょう。
使用したシステムの例は次のとおりです。
ここに「インスティテュート」クラスがあります。研究所にはさまざまな部門や支部があります。各支部には順番に数人の学生がいます。このプログラムでは、研究所全体の学生の総数を数えます。この目的のために集計を使用します。クラスInstituteにはBranchオブジェクトが含まれています。
ブランチオブジェクトには学生オブジェクトがあります。したがって、Branchオブジェクトを使用するInstituteクラスでは、学生の総数をカウントします。この目的のために、私たちは研究所の支部のリストを使用します。
Javaプログラムを以下に示します。
import java.io.*; import java.util.*; // Class Student class Student { String student_name; int student_id ; String student_dept; //Initialize Student class members Student(String student_name, int student_id, String student_dept) { this.student_name = student_name; this.student_id = student_id; this.student_dept = student_dept; } } //Branch class indiates the branch or department to which the student belongs class Branch { String Branch_name; private List students; //Each branch contain students //Initialize class members Branch(String Branch_name, List students) { this.Branch_name = Branch_name; this.students = students; } //return list of students public List getStudents() { return students; } } //Institure class contains branches which in turn have students class Institute { String instituteName; private List branches; //each institure have various branches //initialize members Institute(String instituteName, List branches) { this.instituteName = instituteName; this.branches = branches; } // count and return number of all students in the institute public int getAllStudentsInInstitute() { int noOfStudents = 0; List students; for(Branch branch : branches) { students = branch.getStudents(); for(Student s : students) { noOfStudents++; } } return noOfStudents; } } //Aggregate all the classes=> Institute (contains) branches (contains) Students class Main { public static void main (String() args) { //declare student objects Student s1 = new Student('Megan', 1, 'CSE'); Student s2 = new Student('Mia', 2, 'CSE'); Student s3 = new Student('John', 1, 'ETC'); Student s4 = new Student('Finn', 2, 'ETC'); // List of CSE Students. List cse_students = new ArrayList(); cse_students.add(s1); cse_students.add(s2); //List of ETC Students List etc_students = new ArrayList(); etc_students.add(s3); etc_students.add(s4); //declare Branch objects Branch CSE = new Branch('CSE', cse_students); Branch ETC = new Branch('ETC', etc_students); //make list of branches List branches = new ArrayList(); branches.add(CSE); branches.add(ETC); // creating an object of Institute. Institute institute = new Institute('NIT', branches); //display total number of students System.out.print('Total students in NIT institute: '); System.out.print(institute.getAllStudentsInInstitute()); } }
出力:
したがって、集約と構成は、ここで説明した2つの形式の関連付けです。オブジェクト間の「is-a」関係を必要としない、または表現できない場合、オブジェクト間のより強力な関係が必要な場合は構成を、一方向の関係が必要な場合は集約を行うことができます。
集約と構成の両方が、Javaでコードを再利用するのに役立ちます。
アグリゲーションとコンポジションの違い
コンポジションとアグリゲーションはどちらも、「has-a」関係を表すアソシエーションの一部です。どちらの手法もJava機能ではなく、直接実装する方法はありませんが、Javaコードを使用して実装できます。
コンポジションとアグリゲーションにより、コードを再利用できます。コードの再利用性により、コードのバグが減り、アプリケーションがより安定します。
以下に、集約と構成のいくつかの違いを示します。
集約 | 組成 |
---|---|
集約により、子オブジェクトまたは含まれているオブジェクトを独立して存在させることができます。 例えば 学校に従業員がいる関係では、学校を削除しても、従業員は残り、単独で機能することができます。 | 構成では、含まれているオブジェクトは独立して存在することはできません。 例えば 車にはエンジンがあります。 Carを削除すると、Engineクラスは単独で機能できなくなります。 |
集約は「has-a」関係です。 | 構成は「has-a」関係の形式ですが、「全体の一部」の関係と見なされます。 |
アグリゲーションには1対1の関連付けのみがあります。 | 構成により、関連付けで提供される他の関係が可能になります。 |
集約には、オブジェクト間の弱い関連付けがあります。 | 構成には、オブジェクト間の強い関連性があります。 |
構成対。継承
組成 | 継承 |
---|---|
構成は「Has-A」の関係を表しています。 | 継承は「Is-A」関係を表します。 |
含まれているオブジェクトの実装を簡単に変更できます。 | 1つの実装が変更されると、継承の階層全体が変更されます。 |
動的または実行時のバインディングがあります。 | 静的またはコンパイル時のバインディングがあります。 |
フロントエンドクラスのインターフェイスは、バックエンドクラスに影響を与えることなく簡単に変更できます。 | メソッドまたはプロトタイプの変更は、すべてのクラスに影響します。 |
コンポジションは、既存のオブジェクトに特性や機能を追加する必要がない場合に使用されます。 | 継承は、継承されたクラスにさらに機能を追加する場合に使用されます。 |
よくある質問
Q#1)「IS-A」と「HAS-A」の関係の違いは何ですか?
回答: オブジェクト指向プログラミングでは、IS-A関係は、子クラスが親クラスの「一種」である継承を表します。 Has-a関係は、構成と集約によって表される「全体の一部」関係です。継承は静的バインディングですが、Compositionは動的バインディングです。
Q#2)Javaのアグリゲーションとコンポジションとは何ですか?
回答: コンポジションでは、2つのオブジェクトが緊密に結合されます。つまり、別のオブジェクト(含まれるオブジェクト)を所有するオブジェクト(含むオブジェクト)が破棄されると、他のオブジェクトはそれ自体で独立して機能できないため、自動的に破棄されます。
Aggregationでは、包含オブジェクトと包含オブジェクトは独立して機能できます。これは、集約では、あるオブジェクトが別のオブジェクトを使用するためです。
Q#3)なぜJavaでCompositionを使用するのですか?
配列を逆の順序で印刷する方法
回答: 構成により、既存のコードを再利用できるため、コードの複雑さが軽減され、コードのバグも軽減されます。コンポジションを使用すると、オブジェクトから必要なものだけを再利用でき、オブジェクトの可視性も制御できます。
Q#4)アソシエーションの用途は何ですか?
回答: アソシエーションは、Javaの「has-a」関係を表します。 Javaでの関連付けは、あるオブジェクトが別のオブジェクトの機能とサービスを使用する必要がある場合に使用されます。構成と集約は、関連付けの2つの形式です。
Q#5)コンポジションは継承よりも優れていますか?
回答: コーディングしているのはOOPシステムによって異なります。アプリケーションでその存続期間を通じてIS-A関係でオブジェクトを表すことができる場合は、継承がより適切なオプションです。コードを再利用したいが、IS-A関係でオブジェクトシステムを表現できない場合は、構成の方が優れています。
また、バックエンドクラスに影響を与えずにフロントエンドクラスを頻繁に変更したい場合は、継承の場合、わずかな変更が継承階層全体にほとんど影響するため、構成が優れています。
結論
このチュートリアルでは、JavaでのHASとAの関係について説明しました。構成と集約は、「HAS-A」関係を実装するフォームです。これら両方の実装を比較しました。
どちらにも別のクラスのオブジェクトが含まれていますが、コンポジションはオブジェクトを所有し、集約は単にオブジェクトを使用します。また、Javaの構成と継承を比較しました。
=> JavaトレーニングチュートリアルのA〜Zを確認するには、ここをクリックしてください。