構成は、2 つのオブジェクト間の「部分」関係を表すために使用される関連付けのタイプです。 Java の合成は、「Has-a」関係内の 2 つのエンティティが独自の存在を持ち、互いに依存しない、別のタイプの関連付け集約の制限された形式です。合成では、エンティティの 1 つが他のエンティティに含まれており、単独で存在することはできません。 is-a 関係を表すために使用される継承とは異なります。
たとえば、Car と Engine という 2 つのクラスがあり、Car はエンジン オブジェクトで構成され、エンジン エンティティは Car なしでは存在しません。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文:
class C1{ // A class represents the dependent entity } class C2{ //This class represents the entity that contains the dependent entity by declaring the object of the above class as one of its member variables. private C1 a; }
上記の構文を使用すると、C1 がその存在について他のエンティティに依存する、上記 2 つのエンティティ間に「isPart-Of」関係を確立できます。また、依存オブジェクトの存在はオプションであることも説明できます。
2 つのエンティティの表現に継承を使用すると、IS-A 関係のみが存在できることがわかります。ただし、2 つのエンティティに has-a 関係が含まれる場合は、集計が必要です。集計には 2 つの異なるタイプがあります:
これは、HAS-A 関係で 2 つのエンティティが存在するが、一方のエンティティが他方の存在に依存していない関係を表すために使用されます。また、これは一方向タイプの関連付けです。たとえば、銀行と従業員は 2 つのエンティティであり、銀行という 1 つのエンティティが複数の従業員に関連付けられる可能性があります。したがって、銀行は従業員と 1 対多の関係を持ちますが、その逆は存在しません。
これは、2 つのエンティティの 1 つが別のコンテナ エンティティ内で構成される場合に使用される、限定的なタイプの関連付けです。構成されたエンティティは、コンテナ オブジェクトなしでは存在できません。ただし、null で構成されたエンティティを持つこともできます。したがって、双方向の PART-OF 関係を表すために使用されます。したがって、両方のエンティティは相互に依存しています。
合成は 2 つのエンティティ間の PART-OF タイプの関係を実装するために使用されるため、一方のエンティティはコンテナと呼ばれ、もう一方は合成エンティティと言われます。 構成されたエンティティは完全なコンテナ オブジェクトに似ており、独自のプロパティと操作を備えているため、個別のエンティティが作成されます。このクラスは他のコンテナ クラスで合成エンティティとして使用できるため、コードの再利用にも役立ちます。たとえば、Engine は合成されたクラスであり、Car、TwooWheeler などはそのコンテナ クラスになります。
合成されたクラスはコンテナ エンティティの一部であるため、両方とも相互に依存関係を持ちます。ただし、それでも、Car には強制的にエンジンが必要ないなど、構成されたクラスが null になる可能性があります。これにより、Comused クラスは、その存在がコンテナ クラスに完全に依存するようになります。また、Composition は型の関連付けであるため、PART-OF 関係は HAS-A 関係のサブクラスとも言えます。このようにして、Composition は、継承を使用せずに、相互に依存する 2 つのエンティティ間の関係を実装するのに役立ちます。
デスク、会議室などのさまざまなリストで構成されるオフィスの場合を考えてみましょう。各デスクには 1 台の固定電話があるため、デスク オブジェクトはさらに電話オブジェクトで構成されます。
コード:
package Try; public class Phone { private String Model; private String contactNum; Phone (String model, String num){ this.Model=model; this.contactNum=num; } public void getPhoneDetails(){ System.out.println("Phone Model "+ this.Model); System.out.println("Desk Number " + this.contactNum); } }
コード:
package Try; public class Desk { private String id; private String Mid; private Phone deskNum; private String personName; Desk(String id,String mid,Phone contact,String name){ this.id=id; this.Mid = mid; this.deskNum=contact; this.personName=name; } public void getDeskDetails(){ System.out.println("Desk Details :-"); System.out.println("Id " + this.id); System.out.println("Machine ID "+ this.Mid); System.out.println("Allocated To " + this.personName); this.deskNum.getPhoneDetails(); } }
コード:
package Try; public class MeetingRoom { private String name; private Phone contact; private String location; private int numChairs; private int numTables; MeetingRoom(String name,Phone contact,String location,int nChairs, int nTables){ this.name=name; this.contact=contact; this.location=location; this.numChairs=nChairs; this.numTables=nTables; } public void getMeetingRoomDetails(){ System.out.println("Meeting Room Details :-"); System.out.println("Name " +this.name); System.out.println("Location "+ this.location); System.out.println("Number OF Chairs " + this.numChairs); System.out.println("Number OF Tables "+this.numTables); contact.getPhoneDetails(); } }
コード:
package Try; import java.util.List; public class Office { private String offcName; private List<Desk> deskList; private List<MeetingRoom> roomList; private int pantryNum; public Office(String name , List<Desk> dList, List<MeetingRoom> mList,int pnum){ this.offcName = name; this.deskList = dList; this.roomList = mList; this.pantryNum =pnum; } public void getDetails(){ System.out.println("Below are details of "+ offcName +"Office"); for(Desk a:deskList){ a.getDeskDetails(); } for(MeetingRoom m:roomList){ m.getMeetingRoomDetails(); } System.out.println("Number Of pantry " + pantryNum ); } }
コード:
package Try; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.ArrayList; import java.util.List; public class Demo extends Frame { public static void main(String[] args){ List<Desk> dList =new ArrayList<Desk>(); List<MeetingRoom> mList =new ArrayList<MeetingRoom>(); Phone p1=new Phone("NOTOROLA","12346"); Phone p2=new Phone("NOTOROLA","35235"); Phone p3=new Phone("BSNL","23233"); Phone p4=new Phone("BSNL","123346"); Desk d1 =new Desk("S121","M12",p1,"Tom"); Desk d2 =new Desk("S122","M14",p2,"Pam"); dList.add(d1); dList.add(d2); MeetingRoom m1=new MeetingRoom("Kurukshetra",p3,"Floor_10",10, 2); MeetingRoom m2=new MeetingRoom("Karnal",p4,"Floor_9",20, 3); mList.add(m1); mList.add(m2); Office o1= new Office("Banglore" , dList, mList,20); o1.getDetails(); } }
出力:
説明: 上記のプログラムでは、Office オブジェクトはデスクと会議室エンティティのリストで構成され、さらにデスクと会議室は電話エンティティで構成されます。ここで、電話は常にデスクまたは会議室オブジェクトに関連付けられているため、存在しません。また、会議室とデスクは Office オブジェクトに依存しています。ここでは、単一の電話クラスをデスクと会議室で構成されたエンティティとして使用できるため、コードの再利用性の実現に役立ちます。
これは、双方向の関係を持つ 2 つのエンティティ間の PART-OF 関係を実装するために使用される制限的なタイプの集約であり、コンテナ エンティティなしでは存在しなかった合成エンティティを持ちます。構成されたクラスで行われた変更は、コードの残りの部分やコードの再利用に影響を与えないため、これは有益です。
以上がJavaでの構成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。