解决两个插件之间的循环依赖问题

ycl3bljg  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(507)

我有一门课叫 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` ? 如果有人能教我如何使代码更模块化,我将不胜感激。
ou6hu8tu

ou6hu8tu1#

MinigameManager 需要在一个单独的第三个插件。 MinigameManager 取决于 Minigame ,但是 Minigame 不依赖于 MinigameManager . 因为没有相互依赖,所以没有理由将两者放在同一个库中。 MinigameManager 这将取决于两者 Minigame 以及 Manhunt ,和 Manhunt 还将取决于 Minigame .
或者,您可以使用“registry”类型的方法 MinigameManager 导出一个接口 Manhunt 实现,然后在 MinigameManager 执行一些魔术来枚举和示例化实现其接口的任何类型。这在java中是一种常见的方法,但要清楚:这并不是干净地分离依赖项。这就是简单地将显式依赖关系转换为隐式依赖关系,隐式依赖关系必须遵循明确定义的规则,并产生清晰易懂的结构,隐式依赖关系使您能够隐藏重要的结构并避开dag验证和保护。

相关问题