2

さて、私の質問は次のとおりです。次のようなクラスがあるとします。実行時:
ループが実行されるたびに新しいアクションリスナーが作成されますか?
2番目のクラスは最初のクラスよりもはるかに効率的ですか?
最初のクラスでは、100個の新しいActionListenerオブジェクトが作成されていますか?

public class Foo extends JFrame {
    public Foo() {
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //DO SOMETHING HERE
                }
            });
        }
    }
}

対クラスのような:

public class Foo extends JFrame {
    public Foo() {
        ActionListener someActionListener = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //DO SOMETHING HERE
            }
        }; 
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(someActionListener);
        }
    }
}
4

3 に答える 3

4

2番目の例では1〜2 KB(約0.003セントの価値があります)節約できますが、機能が同じではないため、正確さがより重要になります。

比較すると、最低賃金の1秒は0.2セントの価値があるので、ほんの一瞬でもそれについて考えていたら、それは時間の無駄だったかもしれません。;)

于 2012-08-09T18:42:57.673 に答える
2

new ActionListener()最初のプログラムでは、 100回実行しています。最終的に100個ActionListenerのオブジェクトになります。

2番目のプログラムでは、1回だけ実行new ActionListener()します。したがって、ActionListenerオブジェクトは1つだけになります。

Clearly, in the first program, you are taking up a bunch more memory. But the programs are not equivalent, as in the first, each JTextField has its own ActionListener, where in the second, they all share one.

于 2012-08-09T18:44:22.170 に答える
1

ループが実行されるたびに新しいアクションリスナーが作成されますか?

ファーストクラスでは、そうです。

2番目のクラスは最初のクラスよりもはるかに効率的ですか?

2番目のクラスは、新しい各JTextField()オブジェクトに同じアクションリスナーを提供します。これはより効率的です(いくらかのメモリを節約します)。JTextField()ただし、100個のオブジェクトすべてに同じアクションリスナーがあることを知っておく必要があります。

また、これが当てはまる場合はsomeActionListener = new ActionListener()、のコンストラクターに移動する必要がありますFoo

于 2012-08-09T18:42:10.873 に答える