避免 Arena 和 Portal 之间的循环依赖
Avoiding circular depenency between Arena and Portal
我正在尝试解决这种循环依赖,同时最好保持两个对象不可变。
public class Arena {
private final Portal portal;
Arena(Portal portal) {
this.portal = portal;
}
void close() {
portal.close();
}
void start() {
}
}
public class Portal {
private final Arena arena;
Portal(Arena arena) {
this.arena = arena;
}
void close() {
}
void start() {
arena.start();
}
}
基本上,我需要传送门能够自行激活,并启动竞技场。相反,我需要 Arena 重置并关闭自身和门户。我通过使用两个 HashMap 的 和 找到了解决方案,但是我想弄清楚它是否是解决这个学习和进步的更好方法。
类在这里变得更加简单,因为实际上它们有更多的变量和标识符。
你可以使用依赖倒置,这样 Portal 就不会依赖 Arena
interface Startable{
void start();
}
class Arena extends Startable{...}
然后:
class Portal{
private final Startable arena;
...
}
虽然查看了 Arena 和 Portal 方法,但看起来它们并不是一成不变的
为什么不对 Arena
和 Portal
进行封装 class:
public class PortalArena {
private final Portal portal;
private final Arena arena;
PortalArena(Portal portal, Arena arena) {
this.portal = portal;
this.arena = arena;
}
void startPortal() {
portal.start();
arena.start();
// Rest of the logic here
}
void closeArena() {
arena.close();
portal.close();
// Rest of the logic here
}
//....
}
我正在尝试解决这种循环依赖,同时最好保持两个对象不可变。
public class Arena {
private final Portal portal;
Arena(Portal portal) {
this.portal = portal;
}
void close() {
portal.close();
}
void start() {
}
}
public class Portal {
private final Arena arena;
Portal(Arena arena) {
this.arena = arena;
}
void close() {
}
void start() {
arena.start();
}
}
基本上,我需要传送门能够自行激活,并启动竞技场。相反,我需要 Arena 重置并关闭自身和门户。我通过使用两个 HashMap 的
类在这里变得更加简单,因为实际上它们有更多的变量和标识符。
你可以使用依赖倒置,这样 Portal 就不会依赖 Arena
interface Startable{
void start();
}
class Arena extends Startable{...}
然后:
class Portal{
private final Startable arena;
...
}
虽然查看了 Arena 和 Portal 方法,但看起来它们并不是一成不变的
为什么不对 Arena
和 Portal
进行封装 class:
public class PortalArena {
private final Portal portal;
private final Arena arena;
PortalArena(Portal portal, Arena arena) {
this.portal = portal;
this.arena = arena;
}
void startPortal() {
portal.start();
arena.start();
// Rest of the logic here
}
void closeArena() {
arena.close();
portal.close();
// Rest of the logic here
}
//....
}