将多个对象相互传递
Posted
技术标签:
【中文标题】将多个对象相互传递【英文标题】:Passing Multiple objects To Each other 【发布时间】:2012-10-18 09:27:03 【问题描述】:这是一个有点奇怪的问题,我有一个 GUI 类,它在构造函数中启动一个 Logic 类,负责处理App 那么它们是一个 Handler 类,其中包含一堆 ActionListners
KeyListeners
附加到 GUI 类中的 UI 组件
在 Logic 和 Handler 类的构造函数中,我将 GUI 类作为参数,以便能够操作 在 Logic 和 Handler 类的 GUI 类中创建的 GUI 组件
我的问题是 Handler 使用 Logic 类,反之亦然(Logic 类使用 Handler 类),而我上面描述的方法实际上是不可能的,一个是实例在另一个之前,一个在尝试使用另一个时将为空。
例子:
public class GUI()
this.handler = new Handler(this);
this.logic = new Logic(this);
如果handler
尝试使用logic
中的某些内容,则将返回null
。
解决此问题的一种方法是为handler
设置一个设置器以获取logic
,反之亦然,但这似乎不是问题的答案。
【问题讨论】:
只需使用 setter 方法而不是构造函数来将这些引用相互传递。即logic.setHandler(handler)
和handler.setLogic(logic)
。这真的不是什么大问题。
我将在 main 中创建逻辑,将逻辑传递给 GUI 构造函数,并让 GUI 实例化处理程序。我不认为 Logic 应该直接与 Handler 对话。
这些类彼此了解太多。跨不同类/用途的对象的循环引用是代码异味。我会重构,这样你就可以打破依赖循环。
也许你是对的,我看看能不能改正,谢谢!
【参考方案1】:
简单:
public class GUI()
this.handler = new Handler(this);
this.logic = new Logic(this);
handler.setLogic(logic);
logic.setHandler(handler);
【讨论】:
是的,我想这是唯一的方法,我在想有一种更优雅的方法可以做到这一点,但它有效,谢谢! @Epicmaster:有什么不雅点? 不,我只是在想象有一些方法不涉及 setter,因为 setter 是可选的,而构造函数是强制性的,我不希望出现忘记使用 setter 的情况.但我想这是解决这个问题的唯一方法。【参考方案2】:我认为可以只在 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();
关于“优雅”,我不认为(恕我直言)组件之间的混乱依赖的原始设计是优雅的:) 所以,与其专注于让这些东西看起来“优雅”,不如做一些重新思考,可能你会发现一切都会自动变得优雅得多。 :)
【讨论】:
我比我的回答更喜欢这个。 1+【参考方案3】:在您第一次使用 handler
和 logic
之前,您可以输入此代码 sn-p
如果(处理程序 == null)
this.handler = new Handler(this);
如果(逻辑 == 空)
this.logic = 新逻辑(this);
【讨论】:
如何解决最初的问题,即关于将hander 的引用传递给逻辑和将逻辑传递给handler 的问题? 防止GUI为空。 但这不是他的问题。他没有 GUI 为空的问题,因为以上所有内容都是从 GUI 类中调用的。他想将处理程序设置为逻辑,反之亦然,确保它们都不为空。你上面的代码没有给这个解决方案增加任何东西。 我同意@Hovercraft Full Of Eels 这并不能真正解决问题。我想将 Logic 和 Handler 对象相互传递,而在其他实例对象中没有一个为空。 GUI 不是问题。以上是关于将多个对象相互传递的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 的 $.ajax() 将多个 Json 对象作为数据传递