gpt4 book ai didi

java - 如何安全地创建相互依赖的对象?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:17 25 4
gpt4 key购买 nike

假设我有以下两个类开始:

public class Game {
private final Player self;
private final Player opponent;

public Game(final Player self, final Player opponent) {
this.self = Objects.requireNonNull(self);
this.opponent = Objects.requireNonNull(opponent);
}
}

public class Player {
private final String name;

public Player (final String name) {
this.name = Objects.requireNonNull(name);
}
}

现在我发现我需要访问我的 Player 类中的其他玩家(因此访问 Game 对象)。

一种方法如下,将其添加到 Player 类:

    private Game game;

public void setGame(final Game game) {
this.game = Objects.requireNonNull(game);
}

但是现在它打破了game对象的不变性,有没有办法保持相互创建的对象的不变性?

或者我是否需要求助于手动强加的可变性和安全性(从常规客户端的角度来看,而不是从多线程同步的角度来看)?例如每当有人尝试多次 setGame 时抛出异常。

总而言之,这是我要解决的相互依赖:

Player playerSelf = new Player(/* non-existing game */, "Self");
Player playerOpponent = new Player(/* non-existing game */, "Opponent");
Game game = new Game(playerSelf, playerOpponent);

对比

Game game = new Game(/* non-existing player */, /* non-existing player */);
Player playerSelf = new Player(game, "Self");
Player playerOpponent = new Player(game, "Opponent");

是否存在一种模式,例如构建器模式,它有助于防止构造函数参数的爆炸式增长,如果想在不使用构建器模式的情况下避免暴露,可以通过破坏不变性的方式解决这种模式?

最佳答案

每当你有循环依赖时,打破它。它将有助于减少代码的耦合、提高可测试性并让您保持理智。为什么 Player 首先需要访问其他玩家?您可能试图在其中添加太多功能。或许您可以将其移至 Game 中?或者说,插入到 Player 对象中的 Strategy

另外,请记住,不变性并不总是答案。有些东西,比如游戏状态,本质上是可变的。试图将它们硬塞进不可变的对象中注定会让生活变得悲惨。

关于java - 如何安全地创建相互依赖的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23726363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com