首先,我将简要介绍一些紧密耦合的类(尽管不是最糟糕的情况):
class setUpGUI {
...
JTextField output = new JTextField();
...
CountTimer ct;
...
public void setOtputText(String text) {
output.setText(text);
public startTimer() {
ct = new CountTimer();
}
...
}
class CountTimer implements ActionListener {
private String text = "";
private gui = new SetUpGUI();
...
@Override
public void actionPerformed(ActionEvent e) {
...
gui.setOtputText(text);
...
}
我的问题是关于第二个片段(与第一个片段相比,它自己):
// functionally equivalent to com.google.gwt.user.client.ui.HasText
interface HasText {
String getText();
void setText(String text);
}
class setUpGUI {
...
JTextField output = new JTextField();
...
CountTimer ct;
...
public void setOtputText(String text) {
output.setText(text);
public startTimer() {
ct = new CountTimer(output);
}
...
}
class CountTimer implements ActionListener {
private String text = "";
private HasText txtComp;
...
CountTimer(txtComp) {
...
this.txtComp = txtComp;
...
}
@Override
public void actionPerformed(ActionEvent e) {
...
txtComp.setText(text);
...
}
}
我相信第二个设计可以被认为是松散耦合,因为它不是使用setter
而是通过构造函数传递引用,同时定义它自己的{{1}接口(因为Swing似乎没有一个,我找不到具有HasText
方法的JtextComponent
和JLabel
的共同父级)。你同意吗?
通过构造函数传递参数的一般态度是什么?
答案 0 :(得分:1)
您的第二个示例将文本视图组件传递给实现ActionListener
的类。相反,请考虑扩展AbstractAction
的类,以允许集中处理操作事件。在文本组件的特定情况下,TextAction
提供对焦点文本组件和Document
侦听的基础JTextComponent
模型的访问。作为具体示例,概述了here和here,这些预定义的操作在整个EditorKit
层次结构中使用。
对于定期操作,例如响应计时器可能发生的操作,请考虑让ActionListener
更新文本组件的Document
;监听视图将自动更新以作为响应。在这种情况下,侦听器的构造函数将接收对文本组件模型的引用。