Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相互传递多个对象_Java_Oop_Pass By Value - Fatal编程技术网

Java 相互传递多个对象

Java 相互传递多个对象,java,oop,pass-by-value,Java,Oop,Pass By Value,这是一个有点奇怪的问题,我有一个GUI类,它在构造函数中启动一个逻辑类,负责处理应用程序中的处理或物流,然后它们是一个处理程序类,其中包含一组连接到应用程序中UI组件的ActionListenersKeyListenersGUI类 在逻辑和处理程序类的构造函数中,我将GUI类作为参数,以便能够从逻辑和处理程序类操作GUI类中创建的GUI组件 我的问题是处理程序使用逻辑类,反之亦然(逻辑类使用处理程序类),这在我上面描述的方法中是不可能的,一个在另一个之前,一个在尝试使用另一个时将为空 例如: p

这是一个有点奇怪的问题,我有一个GUI类,它在构造函数中启动一个逻辑类,负责处理应用程序中的处理或物流,然后它们是一个处理程序类,其中包含一组连接到应用程序中UI组件的
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+