在设计我的类时,我目前正在努力解决循环依赖问题.
自从我读到有关贫血领域模型(我一直在做的事情)以来,我一直在努力摆脱创建只是"吸气剂和孵化器"的域对象并回到我的OO根源.
但是,下面的问题是我经常遇到的问题,我不确定应该如何解决它.
假设我们有一个Team类,有很多玩家.这是什么运动并不重要:)球队可以添加和删除球员,就像球员离开球队并加入另一支球队一样.
所以我们有一个团队,其中有一个玩家列表:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们有了Player,它引用了Team:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
可以假设这两种方法(删除和离开)都具有特定于域的逻辑,只要团队移除玩家并且玩家离开团队就需要运行这些逻辑.因此,我首先想到的是当一个团队踢一个玩家时,removePlayer(...)也应该调用player.leaveTeam()方法......
但是如果玩家正在推动出发 - 如果leaveTeam()方法调用team.removePlayer(this)该怎么办?不是没有创造无限循环!
在过去,我刚刚将这些对象设为"哑"POJO,并让服务层完成工作.但即使是现在我仍然存在这个问题:为了避免循环依赖,服务层仍然将它们连接在一起 - 即
public class SomeService {
public void leave(Player player, …Run Code Online (Sandbox Code Playgroud) 这段代码是循环依赖的一个例子吗?
package expr;
import sheet.Sheet
public class AdressExpr implements Expr
{
private Address address;
private Sheet sheet;
public double value(Sheet sheet)
{
return sheet.value(address);
}
}
public interface Expr
{
public double value(Sheet sheet);
}
public class Adress
{
// omissions
}
package sheet;
import expr.Address;
import expr.Expr;
public class Sheet implements SuperSheet
{
private Map <Address, Expr> map;
public double value(Address address)
{
return map.get(Address).value(this);
}
}
public interface SuperSheet
{
public double value(Address address);
}
Run Code Online (Sandbox Code Playgroud)
我知道这个例子是错误的编程,但是由于value方法,接口是否禁止循环依赖?