我有一个用Java编写的应用程序。
我有一个容器类用于我的所有GUI元素MyForm
,我想实现一个类,它提供了几种方法来操作Form FormOperator
。例如,禁用按钮或将点写入TextPane。
现在,许多这些方法需要他们想要操作的GUI元素的实例。例如,方法writeDots(JTextPane p)
但是在下一步中,我想在实现FormOperator
的类中使用类Runnable
。所以我必须将JTextPane
的实例传递给实现Runnable的类,然后Runnable类将它传递给FormOperator类。但在我看来,这不是一个正确的方式。
我的想法是让类Form
成为Singleton,这样我就可以从runnable类中获取Form
的实例。然后我可以在Form
类getTextPane()
中创建一个方法,以获取TextPane的实例。
但是当我读到Singletons也不应该被使用。那么在这种情况下你会建议做什么呢。
P.S:抱歉我的英语不好。 :)但我希望你得到点。答案 0 :(得分:0)
Singleton或其他模式是否合适取决于您提供给我们的更多信息。 “不是一种正确的方法”并不能解释为什么你不想将容器类传递给Runnable实例以传递给FormOperator实例。
问问自己程序中有哪些项目以及它们代表什么,以及它们的预计用途是否与您熟悉的模式相匹配。从表面上看,单身形式对我没有任何意义,但可能在特殊情况下。但是,只是避免在构造函数和方法中传递它是没有理由的。
有时候在编程中我们迷恋于我们已经拥有的一个想法,并找到一种方法使其工作,而不是查看我们试图解决的问题,并找出在代码中建模的最佳方法。要成为一名软件工程师,仅仅做一些工作是不够的,它应该是健壮的,尽可能易于维护,并且可以预测它可能需要的灵活性。
答案 1 :(得分:0)
单身人士出于多种原因并不是一个好的解决方案,主要是因为他们并不比全局变量好多少。 在你的情况下使用singleton会严重损害可重用性,因为一旦你需要同时显示同一个表单的两个实例,你将无法这样做,因为只存在Form和FormOperator类。
如果我是你,在第一步我将实例化Form然后将其作为构造函数参数传递给FormOperator:
public FormOperator(Form frm) {
this.frm = Objects.requireNonNull(frm, "frm cannot be null");
}
稍后需要进一步的重构。应用MVC模式会很有用。值得一读:http://martinfowler.com/eaaDev/uiArchs.html