我有一门课叫 Manhunt
继承的 Minigame
. 为了保持代码和帖子的简短,我只介绍了相关的方法
public abstract class Minigame {
public abstract void startCountdown();
}
public class Manhunt extends Minigame {
@Override
public void startCountdown() {
}
}
小游戏由 MinigameManager
```
public class MinigameManager {
public void startMinigame(String minigame, int gameKey) {
switch (minigame) {
case "manhunt":
UUID runner = this.playersQueued.remove(this.random.nextInt(this.playersQueued.size()));
this.minigame = new Manhunt(gameKey, runner, this.playersQueued);
this.minigame.startCountdown();
this.playersQueued.clear();
break;
case "tbr":
case "boatracer":
break;
default:
}
}
}
问题是, `Manhunt` 以及 `MinigameManager` 在两个独立的插件中,这意味着当前的设置需要intellij为两个相互引用的程序添加依赖项,从而导致循环依赖问题。我想让它们分开,以防我添加额外的小游戏(我只需要拖放额外的小游戏,而不是在同一个程序中编码它们),但我如何解决这个循环依赖问题?
看起来依赖性反转原理应该可以解决这个问题,但是我不确定如何将它合并到我的程序中。我需要为创建一个接口吗 `MinigameManager` 或者 `Minigame` ? 如果有人能教我如何使代码更模块化,我将不胜感激。
1条答案
按热度按时间ou6hu8tu1#
MinigameManager
需要在一个单独的第三个插件。MinigameManager
取决于Minigame
,但是Minigame
不依赖于MinigameManager
. 因为没有相互依赖,所以没有理由将两者放在同一个库中。MinigameManager
这将取决于两者Minigame
以及Manhunt
,和Manhunt
还将取决于Minigame
.或者,您可以使用“registry”类型的方法
MinigameManager
导出一个接口Manhunt
实现,然后在MinigameManager
执行一些魔术来枚举和示例化实现其接口的任何类型。这在java中是一种常见的方法,但要清楚:这并不是干净地分离依赖项。这就是简单地将显式依赖关系转换为隐式依赖关系,隐式依赖关系必须遵循明确定义的规则,并产生清晰易懂的结构,隐式依赖关系使您能够隐藏重要的结构并避开dag验证和保护。