全球国家和单身人士依赖注入

Man*_*anu 9 singleton dependency-injection global-variables

这是我在设计新应用时遇到的很多问题.我将用一个示例问题来解释这一点.

我正在写简单的游戏,所以我想要一个玩家列表.我的选择很少......

  1. 在某个类中使用静态字段
private  static ArrayList<Player> players = new ArrayList<Integer>();  
public Player getPlayer(int i){
    return players.get(i);
}
Run Code Online (Sandbox Code Playgroud)

但这是一个全球化的国家

  1. 或者我可以使用单身人士
class PlayerList{
    private PlayerList instance;
    private PlayerList(){...}
    public PlayerList getInstance() {
        if(instance==null){
            ...
        }
        return instance;
    } 
 }
Run Code Online (Sandbox Code Playgroud)

但这很糟糕,因为它是一个单身人士

  1. 依赖注入
class Game {
    private PlayerList playerList;
    public Game(PlayerList list) {
        this.list = list;
    }
    public PlayerList getPlayerList() {
        return playerList;
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎很好,但事实并非如此.

如果Game之外的任何对象需要查看PlayerList(这是通常的情况), 我必须使用上述方法之一来使Game类全局可用.所以我只是为问题添加了另一层.我实际上没有解决任何问题.

什么是最佳解决方案?(目前我使用Singleton方法)

Joh*_*ler 2

依赖注入背后的想法正如名称所示,注入依赖项。因此,任何需要了解玩家列表的对象都将被注入。通常,在切换到依赖项查找或其他机制之前,尽可能广泛地使用依赖项注入是很有意义的。这也使得以后可以扩展游戏,为不同级别或任何您可能想到的扩展提供不同的玩家列表。

  • 你会再次注射它。像 Spring 这样的框架(只要您使用 Java 编程)将使您变得更容易。任何不是服务或单例本身并因此无法合理地注入 PlayersList 的东西都将由某种工厂创建,而工厂又可以很好地注入 PlayersList 并将其传递给它创建的对象。但是,如果您最终将 PlayerList 注入到每个对象中,您应该重新考虑您的设计,尤其是封装和信息隐藏。 (2认同)