Java 相互传递多个对象
这是一个有点奇怪的问题,我有一个GUI类,它在构造函数中启动一个逻辑类,负责处理应用程序中的处理或物流,然后它们是一个处理程序类,其中包含一组连接到应用程序中UI组件的Java 相互传递多个对象,java,oop,pass-by-value,Java,Oop,Pass By Value,这是一个有点奇怪的问题,我有一个GUI类,它在构造函数中启动一个逻辑类,负责处理应用程序中的处理或物流,然后它们是一个处理程序类,其中包含一组连接到应用程序中UI组件的ActionListenersKeyListenersGUI类 在逻辑和处理程序类的构造函数中,我将GUI类作为参数,以便能够从逻辑和处理程序类操作GUI类中创建的GUI组件 我的问题是处理程序使用逻辑类,反之亦然(逻辑类使用处理程序类),这在我上面描述的方法中是不可能的,一个在另一个之前,一个在尝试使用另一个时将为空 例如: p
ActionListeners
KeyListeners
GUI类
在逻辑和处理程序类的构造函数中,我将GUI类作为参数,以便能够从逻辑和处理程序类操作GUI类中创建的GUI组件
我的问题是处理程序使用逻辑类,反之亦然(逻辑类使用处理程序类),这在我上面描述的方法中是不可能的,一个在另一个之前,一个在尝试使用另一个时将为空
例如:
public class GUI()
{
this.handler = new Handler(this);
this.logic = new Logic(this);
}
如果处理程序
尝试使用逻辑
中的某个内容,则将返回null
解决这一问题的一种方法是使用setter,让处理程序
获取逻辑,反之亦然,但这似乎不是问题的答案。简单:
public class GUI()
{
this.handler = new Handler(this);
this.logic = new Logic(this);
handler.setLogic(logic);
logic.setHandler(handler);
}
在第一次使用处理程序
和逻辑
之前,您可以将此代码段放入
如果(handler==null)
this.handler=新处理程序(this)
如果(逻辑==null)
this.logic=新逻辑(this)
我认为在GUI中公开处理程序和逻辑并让公众访问是可能的。通过这样做,由于处理程序和逻辑已经引用了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();
}
}
关于“优雅”,我认为组件之间杂乱无章的依赖关系的原始设计一点也不优雅:)因此,与其专注于让这些东西看起来“优雅”,不如重新思考一下,也许你会发现一切都会自动变得更加优雅。:) 只需使用setter方法而不是构造函数来相互传递这些引用。i、 例如,logic.setHandler(handler)
和handler.setLogic(logic)
。这真的不是什么大问题。我将在main中创建逻辑,将逻辑传递给GUI构造函数,并让GUI实例化处理程序。我不认为逻辑应该直接与处理程序对话。这些类彼此了解得太多了。不同类/用途的对象之间的循环引用是一种代码味道。我会重构,这样你就可以打破依赖循环。也许你是对的,我会看看我是否可以纠正这一点,谢谢!是的,我想这是唯一的方法,我想有一种更优雅的方法,但是它很有效,谢谢@Epicmaster:这有什么不雅的地方?不,只是我在想象有一种方式不涉及setter,因为setter是可选的,构造函数是强制性的,我不希望出现setter被忘记使用的情况。但我想这是解决这个问题的唯一方法。这是如何解决最初的问题的,关于将hander的引用传递给逻辑,将逻辑传递给handler的问题?它防止GUI为空。但这不是他的问题。他没有GUI为null的问题,因为上面所有的内容都是从GUI类中调用的。他希望将处理程序设置为逻辑,反之亦然,确保它们都不为null。你上面的代码没有给这个解决方案添加任何内容。我同意@Hovercraft充满鳗鱼,但这并不能真正解决问题。我希望将逻辑和处理程序对象相互传递,而不让其他实例对象中的一个为null。GUI不是问题所在。我更喜欢这个而不是我的答案。1+