循环依赖通常是代码设计上的问题,常常造成程序运行错误和性能问题。在避免Arena和Portal之间出现循环依赖的问题上,可以采取以下解决方案:
在Arena中定义一个接口,例如IArena,包含Portal需要使用的所有方法。而Portal只依赖于IArena接口,而不是与Arena类直接耦合。
public interface IArena {
public void startBattle();
public void endBattle();
}
public class Arena implements IArena {
private Portal portal;
public Arena(Portal portal) {
this.portal = portal;
}
public void startBattle() {
// do something
}
public void endBattle() {
// do something
}
}
public class Portal {
private IArena arena;
public Portal(IArena arena) {
this.arena = arena;
}
public void accessArena() {
arena.startBattle();
arena.endBattle();
}
}
在这种方式下,我们可以通过把Portal或IArena注入Arena中,来打破Arena和Portal之间的循环依赖。
public interface IArena {
public void startBattle();
public void endBattle();
}
public class Arena {
private IArena portal;
public setPortal(IArena portal) {
this.portal = portal;
}
public void startBattle() {
// do something
portal.endBattle();
}
public void endBattle() {
// do something
}
}
public class Portal implements IArena {
private Arena arena;
public accessArena(Arena arena) {
this.arena = arena;
}
public void startBattle() {
arena.startBattle();
}
public void endBattle() {