相互传递多个对象

Passing Multiple objects To Each other

提问人:Sammy Guergachi 提问时间:10/29/2012 最后编辑:VikdorSammy Guergachi 更新时间:10/29/2012 访问量:267

问:

这是一个有点奇怪的问题,我有一个 GUI 类,它在构造函数中启动一个 Logic 类,该类负责处理应用程序中的处理或物流,然后有一个 Handler 类,其中包含一堆附加到 GUI 类中的 UI 组件ActionListnersKeyListeners

Logic 和 Handler 类的构造函数中,我将 GUI 类作为参数,以便能够从 LogicHandler 类操作在 GUI 类中创建的 GUI 组件

我的问题是 The Handler 使用 Logic 类,反之亦然(Logic 类使用 Handler 类),而我上面描述的方法实际上是不可能的,一个是实例,另一个是实例,一个在尝试使用另一个时为 null。

例:

public class GUI() 
{
    this.handler = new Handler(this);
    this.logic = new Logic(this);
}

如果尝试使用某些内容,则将返回。handlerlogicnull

解决这个问题的一种方法是让二传手拿走,反之亦然,但这似乎不是这个问题的答案。handlerlogic

Java OOP 按值传递

评论

0赞 Hovercraft Full Of Eels 10/29/2012
只需使用 setter 方法而不是构造函数即可将这些引用相互传递。即和 .这真的不是什么大问题。logic.setHandler(handler)handler.setLogic(logic)
0赞 ignis 10/29/2012
我会在 main 中创建 Logic,将 Logic 传递给 GUI 构造函数,并让 GUI 实例化 Handler。我不认为逻辑应该直接与处理程序交谈。
3赞 Matt Ball 10/29/2012
这些班级彼此了解太多了。跨不同类/用途的对象的循环引用是一种代码气味。我会重构,以便您可以打破依赖循环。
0赞 Sammy Guergachi 10/29/2012
也许你是对的,我会看看我能不能纠正它,谢谢!

答:

1赞 Hovercraft Full Of Eels 10/29/2012 #1

简单:

public class GUI() 
{
    this.handler = new Handler(this);
    this.logic = new Logic(this);
    handler.setLogic(logic);
    logic.setHandler(handler);
}

评论

0赞 Sammy Guergachi 10/29/2012
是的,我想这是唯一的方法,我以为有一种更优雅的方法,但它有效,谢谢!
0赞 Hovercraft Full Of Eels 10/29/2012
@Epicmaster:这有什么不优雅的?
0赞 Sammy Guergachi 10/29/2012
不,我只是在想象有某种不涉及 setter 的方法,因为 setter 是可选的,而构造函数是强制性的,我不希望出现忘记使用 setter 的情况。但我想这是解决这个问题的唯一方法。
0赞 user880855 10/29/2012 #2

在你第一次使用 and 之前,你可以把这个代码片段
if(handler == null)
this.handler = new Handler(this);
if(logic == null)
this.logic = new Logic(this);
handlerlogic

评论

0赞 Hovercraft Full Of Eels 10/29/2012
这如何解决最初的问题,即将 hander 的引用传递给逻辑并将逻辑传递给 handler 的问题?
0赞 10/29/2012
它可以防止 GUI 为 null。
0赞 Hovercraft Full Of Eels 10/29/2012
但这不是他的问题。他没有 GUI 为 null 的问题,因为上述所有内容都是从 GUI 类中调用的。他想将处理程序设置为逻辑,反之亦然,确保它们都不是 null。上面的代码不会对此解决方案添加任何内容。
0赞 Sammy Guergachi 10/29/2012
我同意 @Hovercraft Full Of Eels 的观点,这并不能真正解决问题。我想将 Logic 和 Handler 对象相互传递,而另一个实例化对象中的一个为 null。GUI 不是问题所在。
1赞 Adrian Shum 10/29/2012 #3

我认为可以在 GUI 中公开 Handler 和 Logic,并让公众访问它。通过这样做,由于 Handler 和 Logic 已经引用了 GUI,因此它们可以间接地相互访问:

class Gui {
  private Handler handler;
  private Logic logic;

  public Handler getHandler() {
    return this.handler;
  }
  public Logic getLogic() {
    return this.logic;
  }
}

class Handler {
  private Gui gui;
  public Handler(Gui gui) {
    this.gui = gui;
  }

  public void doSomething() {
    // access logic
    this.gui.getLogic().doSomeLogic();
  }
}

关于“优雅”,我不认为(恕我直言)组件之间凌乱的依赖关系的原始设计是优雅的:)因此,与其专注于让这些东西看起来“优雅”,不如做一些重新思考,您可能会发现一切都会自动变得更加优雅。:)

评论

0赞 Hovercraft Full Of Eels 10/30/2012
我比我的答案更喜欢这个。1+