通过构造函数传递参数

时间:2014-02-28 17:59:00

标签: java swing decoupling loose-coupling

首先,我将简要介绍一些紧密耦合的类(尽管不是最糟糕的情况):

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方法的JtextComponentJLabel的共同父级)。你同意吗?

通过构造函数传递参数的一般态度是什么?

1 个答案:

答案 0 :(得分:1)

您的第二个示例将文本视图组件传递给实现ActionListener的类。相反,请考虑扩展AbstractAction的类,以允许集中处理操作事件。在文本组件的特定情况下,TextAction提供对焦点文本组件和Document侦听的基础JTextComponent模型的访问。作为具体示例,概述了herehere,这些预定义的操作在整个EditorKit层次结构中使用。

对于定期操作,例如响应计时器可能发生的操作,请考虑让ActionListener更新文本组件的Document;监听视图将自动更新以作为响应。在这种情况下,侦听器的构造函数将接收对文本组件模型的引用。