我为我的应用程序创建了这个GUI。在覆盖方法actionPerformed
中我必须为字符串final
插入command
,因为此变量用于内部类。有办法避免这个问题吗?
@Override
public void actionPerformed(ActionEvent e)
{
final String command = e.getActionCommand();
if(command.equals("add"))
{
new Thread(new Runnable(){
@Override
public void run()
{
// ... code skipped ... //
ous.writeObject(command);
// ... code skipped ... //
}
}).start();
}
else if(command.equals("remove"))
{
new Thread(new Runnable(){
@Override
public void run()
{
// ... code skipped ... //
ous.writeObject(command);
// ... code skipped ... //
}
}).start();
}
}
我试图解决声明
的问题String command = null;
在代码的开头。
答案 0 :(得分:3)
您可以创建一个实现Runnable
的单独类,在构造函数中传递String
并使用该对象创建线程。像:
class ThreadTask implements Runnable {
private String command;
public ThreadTask(String command) {
this.command = command;
}
public void run {
//
}
}
它还使代码更具可读性IMO。
答案 1 :(得分:1)
不,这是java中的一个功能。这是其“封闭”实施的一个限制。关闭变量必须是最终的。
答案 2 :(得分:1)
首先,你的内部类中不需要command
:当你创建一个实例时,你肯定知道command
的值,所以你也可以使用实际价值。
话虽如此,我会在适当的非匿名类中提取显然重复的代码,并将其传递给command
。这也会改变设计,以便你可以不再担心command
是最终的。