gpt4 book ai didi

java - Java 中的监听器的资源密集程度如何?

转载 作者:太空狗 更新时间:2023-10-29 22:44:12 24 4
gpt4 key购买 nike

我是 Java 编程的新手,但却是一位经验丰富的 C++ 程序员。我正在学习如何使用 swing 对 GUI 进行编程。我想知道 ActionListeners 的资源密集程度如何(运行时和内存)?对于应该在特定程序中创建的监听器总数,是否有一般准则?有多少直到性能受到影响?

我目前正在通过 Deitel Developer Series Java for Programmers 一书学习 Java。在一个特定的例子中,他们有一个 JRadioButtonItems 数组作为类的私有(private)变量。他们还创建了一个从 ActionListener 类扩展而来的 ItemHandler 类,该类对整个单选按钮数组进行线性搜索,以确定被选中的按钮并相应地更改程序的状态。数组中的所有单选按钮共享同一个 Action 监听器。这似乎对信息进行线性搜索相当低效,所以我重写了 ActionListener 类以在构造函数中接受要修改的建议值,并为每个单选按钮提供了自己的 ActionListener,并使用构造函数传入的建议值以避免进行线性搜索。哪种方法在性能方面会更好?我很抱歉听起来像个菜鸟,我只是想养成一套良好的 Java 编程习惯。附件是代码的一个小例子。谢谢。

    /************************************************************************
Original code in Deitel book with linear search of selected Radio button in Actionlistener
****************************************************************************/
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;


public class MenuTest extends JFrame{
private final Color colorValues[] = {Color.BLACK, Color.WHITE, Color.GREEN};
private JRadioButtonMenuItem colorItems[];
private ButtonGroup colorButtonGroup;


public MenuTest(){
super("Menu Test");
JMenu fileMenu = new JMenu("File");

JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(fileMenu);

String colors[] = {"Black", "White", "Green"};
JMenu colorMenu = new JMenu("Color");
colorItems = new JRadioButtonMenuItem[colors.length];
colorButtonGroup = new ButtonGroup();

ItemHandler itemHandler = new ItemHandler();

for(int count = 0; count < colors.length; count++){
colorItems[count] = new JRadioButtonMenuItem(colors[count]);
colorMenu.add(colorItems[count]);
colorButtonGroup.add(colorItems[count]);
colorItems[count].addActionListener(itemHandler);
}

colorItems[0].setSelected(true);
fileMenu.add(colorMenu);
fileMenu.addSeparator();

}

private class ItemHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
for(int count = 0; count < colorItems.length; count++){
if(colorItems[count].isSelected()){
getContentPane().setBackground(colorValues[count]);
}
}
}
}


public static void main(String args[]){
MenuTest menuFrame = new MenuTest();
menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuFrame.setSize(600,400);
menuFrame.setVisible(true);
menuFrame.getContentPane().setBackground(menuFrame.colorValues[0]);
}
}
/************************************************************************
My Code redefined version of Deitel's w/o linear search in ActionListener
************************************************************************/

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;

public class MenuTest extends JFrame{
private final Color colorValues[] = {Color.BLACK, Color.WHITE, Color.GREEN};
private JRadioButtonMenuItem colorItems[];
private ButtonGroup colorButtonGroup;


public MenuTest(){
super("Menu Test");
JMenu fileMenu = new JMenu("File");

JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(fileMenu);

String colors[] = {"Black", "White", "Green"};
JMenu colorMenu = new JMenu("Color");
colorItems = new JRadioButtonMenuItem[colors.length];
colorButtonGroup = new ButtonGroup();

ItemHandler itemHandler = new ItemHandler();

for(int count = 0; count < colors.length; count++){
colorItems[count] = new JRadioButtonMenuItem(colors[count]);
colorMenu.add(colorItems[count]);
colorButtonGroup.add(colorItems[count]);
colorItems[count].addActionListener(new ItemHandler(colorValues[count]));
}

colorItems[0].setSelected(true);
fileMenu.add(colorMenu);
fileMenu.addSeparator();

}

private class ItemHandler implements ActionListener{
private Color setColor;
public ItemHandler(Color inColor){
super();
setColor = inColor;
}
public void actionPerformed(ActionEvent event){
getContentPane().setBackground(setColor);
repaint();
}
}
public static void main(String args[]){
MenuTest menuFrame = new MenuTest();
menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuFrame.setSize(600,400);
menuFrame.setVisible(true);
menuFrame.getContentPane().setBackground(menuFrame.colorValues[0]);
}
}

最佳答案

CPU 使用率:接近于零。监听器仅在它们监听的对象的状态发生变化时才会被调用。他们并不真正“听”。他们正在收听的对象会在需要时调用他们。 (注意:这是一个简化)

内存使用:大多数情况下,ActionListener 没有状态。因此,总持久内存使用量是任何对象所需的最小值。在您的示例中,有 is 状态,因为您有一个 setColor 字段。但是内存使用率很低。

IMO,听众是高效的,您可以使用任意数量的听众。

关于java - Java 中的监听器的资源密集程度如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1083580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com