Javaの設計についての基本的な質問です。
企業を表すCompanyクラスのフィールドに、そこで働く従業員を表すEmployerクラスのSetを保持していたとします。
Employerクラスは自身の所属するCompanyを取得するためのメソッドgetCompany()を持っていたとします。
public class Company{
Set<Employer> employers;
}
public class Employer{
public Company getCompany(){
}
}
実現したいのは「従業員から自身の所属する企業を知る」ということです。
このgetCompany()を実現するためにはEmployerのフィールドに所属するCompanyのインスタンスを保持することになると思います。
また、特にDIなどは考えないとすると、Employerクラスのインスタンス生成時等には所属するCompanyクラスのインスタンスを渡すなどの必要があります。
上記のようにすれば実現自体は可能なことはわかるのですが、循環参照のような形となり適切でないような気がします。
Company has employers. は正しいと思いますが、
Employer has a company. は何か違う気がします。
EmployerのコンストラクタにCompanyを渡して、生成したEmployerをそのCompanyにaddするのも不自然に感じます。
これらを実現するためにはどのような形が適切と言えるのでしょうか。
上記は最も正しい・美しい形といえるのでしょうか。
そもそも何か根本的なところが誤っていますでしょうか。
これはあくまで例ですが、回答いただくには情報が足りないのであればご指摘ください。
結果、
http://oshiete.goo.ne.jp/qa/2652715.html
こちらの質問と全く同じになってしまいましたが、Javaでも同様でしょうか。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
NO.1 にも書きましたが DIP を使うという手段もあります。
組織の骨組み(構造)を定義するパッケージを
一つも設け、Employee や Company はそこで
インターフェースとして定義します。
本当の Employee や Company はインターフェースを実装します。
こうすると、インターフェース間の相互参照は残りますが、
クラス間の相互参照は消えてしまいますので好きなパッケージで
Employee や Company 実装することが可能になり、jarの相互残照
などが起こることも無くなります。
Employee や Companyの具象クラスが様々なパッケージに
分散するようでしたら、検討してみるべきです。
No.1
- 回答日時:
has は相手を「所有する」強い依存関係ですが、
Employee から Company への関係はもっと弱い
より「一般的な依存関係」です。
この区別を学びましょう。
相互参照は注意すべきですが、Java は
相互参照を認めている言語なので
そう神経質になることはないでしょう。
ただ、jarを超えて循環参照などはできないので
そういう時は DIPなどを使うことになると思います。
ご回答ありがとうございます。
依存関係の強度についてあまり考えていませんでした。
勉強してみます。
ただどうしても相互参照に起因する不整合のリスクが発生してしまうのが心配です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 営業・販売・サービス 仕入れの方法 1 2023/05/21 18:55
- 英語 "keep someone company"の文の構造について 3 2023/06/08 15:30
- 英語 "consider doing something"において"doing"の要否の判断方法について 2 2023/07/04 04:36
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- 英語 とあるTOEIC教材の文章の構文で教えて頂きたいです 3 2022/05/03 04:06
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 英語 総称的意味の「the+過去分詞」が無冠詞複数形で置き換えることができない理由について 5 2022/08/04 10:14
- 英語 英語の和訳問題で Those of us who are employed by a company 6 2022/07/31 12:05
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
変数名の付け方
-
VB.NET getとsetの概念がわかり...
-
変数の参照でエラーが出てしま...
-
C# インスタンスの破棄
-
抽象クラスのインスタンス生成...
-
オブジェクト参照がオブジェク...
-
他のファイルの変数参照
-
クラス型がインスタンス化され...
-
エクセル(複数インスタンス)...
-
C#において、同じインスタンス...
-
VB6.0のクラスで、自分自身のイ...
-
マルチスレッドでのインスタン...
-
文字列を日付に変換でParseExce...
-
String型もしくはint型をIntege...
-
VC#での24ビットbmp形式での保...
-
newしないインスタンス?実体化...
-
生成したインスタンスを削除す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
おすすめ情報