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

Resolving the circular dependency issue I have between two plugins

我有一个名为 Manhunt 的 class 继承了 Minigame。为了保持代码和 post 简短,我只包括相关方法

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:
        }
    }

}

问题是,ManhuntMinigameManager 在两个单独的插件中,这意味着当前的设置需要 IntelliJ 为两个相互引用的程序添加依赖项,从而导致循环依赖问题。我想让它们分开,以防我添加额外的小游戏(我只需要拖放额外的小游戏,而不是在同一个程序中对它们进行编码),但是如何解决这个循环依赖问题?

似乎依赖倒置原则应该可以解决这个问题,但我不确定如何将其合并到我的程序中。我是否需要为 MinigameManagerMinigame 创建接口?如果有人可以指导我使代码更加模块化,我将不胜感激。

MinigameManager 需要在单独的第三个插件中。

MinigameManager依赖于Minigame,但是Minigame不依赖于MinigameManager。由于没有相互依赖性,因此没有理由将两者放在同一个库中。

MinigameManager 将同时依赖于 MinigameManhunt,并且 Manhunt 仍将依赖于 Minigame.

或者,您可以使用“注册表”类型的方法,其中 MinigameManager 导出 Manhunt 实现的接口,然后 MinigameManager 中的一些运行时代码执行一些魔法来枚举并实例化任何实现其接口的类型。这是 Java 中的一种常见方法,但要清楚:这不是完全分离依赖关系。 这只是转换 显式依赖关系 ,必须遵循清晰定义的规则并产生清晰且易于查看的结构,转换为 隐式依赖项 ,使您能够隐藏重要的结构并回避 DAG 验证和保护。