java - 初始化时表达相互连接
问题描述
在有一个对象处理多个其他对象的情况下,如何在初始化时表示所有权?
例如,假设有一只鸡孵化多个鸡蛋。小鸡没有父母是不好的,但小鸡也应该只把注意力集中在它的小鸡身上。如果这种关系应该在初始化时表达出来,怎么可能呢?
在这种情况下,哪种设计模式最适合使用?
如果可能,最好避免使用null
,因为这可能会给系统带来歧义。如果使用它是不可避免的,如何最好地减少歧义?
示例程序:
public class MyClass {
/**
* Handles eggs
* */
public static class Chicken{
private Egg[] eggs;
public Chicken(Egg... eggs_){
eggs = eggs_;
}
public void accept_signal(String message){
/* ... */
}
}
/**
* Signals when its ready to hatch
* */
public static abstract class Egg{
private final Chicken parent;
public Egg(Chicken parent_){
parent = parent_;
}
public void hatch(){
parent.accept_signal("chirp chirp");
}
}
/**
* The resulting children to be handled
* */
public static class YellowChick extends Egg{
public YellowChick(Chicken parent_){
super(parent_);
}
}
public static class BrownChick extends Egg{
public BrownChick(Chicken parent_){
super(parent_);
}
}
public static class UglyDuckling extends Egg{
public UglyDuckling(Chicken parent_){
super(parent_);
}
}
public static void main (String[] args){
Chicken momma = new Chicken(
// new YellowChick(), new BrownChick(), new UglyDuckling() /* How can these objects be initialized properly? */
);
}
}
解决方案
软件中的循环依赖通常是个坏主意。
像这样的问题的解决方案,
Chicken <--> Egg
...是引入一个管理关系的中间人。
管理器可以以不同的方式实现。
Chicken --> PoultryMediator <-- Egg
在这里,经理充当调解人,在运行时回答查询并提供参考。Chicken <-- PoultryInjector --> Egg
在这里,管理器充当依赖注入器,在构建时连接对象。
有关一些相关链接,另请参阅:发现循环依赖问题。
推荐阅读
- python - 没有 lambda 的 Python 编写
- java - Gradle:使用自定义结构部署 JAR:仅包含 dir + 其内容
- html - 如何仅使用 HTML 制作此表
- mysql - 从 INNER JOIN SQL 中的第二个表返回第一个索引
- sql - 在 SQL 查询中排序
- java - 每次出现某个角色后,我怎样才能打破一个段落?
- flutter - 降级颤振版本以避免空安全
- c# - 无法使用 C# 更新 Unity2D 中的刚体
- amazon-web-services - Runway X Serverless Framework:使用 Runway for CICD 从无服务器仪表板使用环境变量进行部署
- spring-boot - 如何优雅地关闭 Spring Boot 应用程序