Java class 与匿名 class 的 Swing 传递实例
Java Swing passing instance of class vs anonymous class
我正在学习 Swing 教程,我发现有两种方法可以使下面的代码正常工作。本质上,我们正在创建一个框架并在其中放置按钮和文本区域。据我所知,它们实现了相同的功能,但是我很好奇下面的区别是什么/对于更大的项目来说,这是否是一种更好的方法。
这是教程中显示的方式:
public class MainFrame extends JFrame {
private TextPanel textPanel;
private ButtonPanel buttonPanel;
public MainFrame(String title){
this.setTitle(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,600);
this.setLayout(new BorderLayout());
this.textPanel = new TextPanel();
this.buttonPanel = new ButtonPanel();
this.buttonPanel.setTextListener(new TextListener(){
public void deliverText(String text) {
textPanel.appendText(text);
}
});
this.add(textPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setVisible(true);
}
这是我在摆弄代码时发现的另一种方法:
public class MainFrame extends JFrame implements TextListener{
private TextPanel textPanel;
private ButtonPanel buttonPanel;
public MainFrame(String title){
this.setTitle(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,600);
this.setLayout(new BorderLayout());
this.textPanel = new TextPanel();
this.buttonPanel = new ButtonPanel();
this.buttonPanel.setTextListener(this);
this.add(textPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setVisible(true);
}
public void deliverText(String text){
this.textPanel.appendText(text);
}
}
TextListener 是一个基本上在按钮和文本区域之间进行通信的接口,因此当按下按钮时,该按钮内的文本将出现在文本区域中。
这两种方法是否被认为是更好的方法?实际上是否存在我不知道的显着差异?
对我来说,第二种方法(MainFrame 实现 TextListener)似乎是一种更昂贵的处理方式,因为我们传递的是 MainFrame 的整个实例,而真正需要的只是有关 TextListener 的信息。我想在 MainFrame 中有很多组件的大型程序中,这将开始成为一个问题。这是正确的思考方式吗?当我传递参数时 "this" 是 MainFrame 创建的副本浪费内存还是引用了原始副本的相同内存位置?
既然你这里有一个简单的例子,那你用起来确实不是问题。
还有第三种选择 - 创建一个单独的 class 来实现自己的接口。该选项允许为侦听器定义构造函数。有时这很有用。
现在,this
只是一个引用,所以没有复制,所以不再使用内存。我认为不实例化匿名 class 占用的资源更少。
基本上,当有许多不同的按钮都添加了 this
作为界面时,我是如何解释这种方法的。在接口方法的实现中,使用 if 语句检查了按钮的来源。这比添加单独的匿名 classes 来为每个组件处理相同的事件占用更少的资源。
如果您的代码从按钮以外的其他地方追加文本是有益的,请使用非匿名 void deliverText(String text)
方法。
否则请使用匿名 TextListener。唯一的缺点是在编译的 classes/JAR.
集合中会有一个额外的 .class
文件
我正在学习 Swing 教程,我发现有两种方法可以使下面的代码正常工作。本质上,我们正在创建一个框架并在其中放置按钮和文本区域。据我所知,它们实现了相同的功能,但是我很好奇下面的区别是什么/对于更大的项目来说,这是否是一种更好的方法。
这是教程中显示的方式:
public class MainFrame extends JFrame {
private TextPanel textPanel;
private ButtonPanel buttonPanel;
public MainFrame(String title){
this.setTitle(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,600);
this.setLayout(new BorderLayout());
this.textPanel = new TextPanel();
this.buttonPanel = new ButtonPanel();
this.buttonPanel.setTextListener(new TextListener(){
public void deliverText(String text) {
textPanel.appendText(text);
}
});
this.add(textPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setVisible(true);
}
这是我在摆弄代码时发现的另一种方法:
public class MainFrame extends JFrame implements TextListener{
private TextPanel textPanel;
private ButtonPanel buttonPanel;
public MainFrame(String title){
this.setTitle(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,600);
this.setLayout(new BorderLayout());
this.textPanel = new TextPanel();
this.buttonPanel = new ButtonPanel();
this.buttonPanel.setTextListener(this);
this.add(textPanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setVisible(true);
}
public void deliverText(String text){
this.textPanel.appendText(text);
}
}
TextListener 是一个基本上在按钮和文本区域之间进行通信的接口,因此当按下按钮时,该按钮内的文本将出现在文本区域中。
这两种方法是否被认为是更好的方法?实际上是否存在我不知道的显着差异?
对我来说,第二种方法(MainFrame 实现 TextListener)似乎是一种更昂贵的处理方式,因为我们传递的是 MainFrame 的整个实例,而真正需要的只是有关 TextListener 的信息。我想在 MainFrame 中有很多组件的大型程序中,这将开始成为一个问题。这是正确的思考方式吗?当我传递参数时 "this" 是 MainFrame 创建的副本浪费内存还是引用了原始副本的相同内存位置?
既然你这里有一个简单的例子,那你用起来确实不是问题。
还有第三种选择 - 创建一个单独的 class 来实现自己的接口。该选项允许为侦听器定义构造函数。有时这很有用。
现在,this
只是一个引用,所以没有复制,所以不再使用内存。我认为不实例化匿名 class 占用的资源更少。
基本上,当有许多不同的按钮都添加了 this
作为界面时,我是如何解释这种方法的。在接口方法的实现中,使用 if 语句检查了按钮的来源。这比添加单独的匿名 classes 来为每个组件处理相同的事件占用更少的资源。
如果您的代码从按钮以外的其他地方追加文本是有益的,请使用非匿名 void deliverText(String text)
方法。
否则请使用匿名 TextListener。唯一的缺点是在编译的 classes/JAR.
集合中会有一个额外的.class
文件