【问题标题】:Access an instance of a class from anonymous class argument从匿名类参数访问类的实例
【发布时间】:2014-03-27 09:49:57
【问题描述】:
我似乎无法通过网站上的所有匿名内部类问题找到答案。
public void start()
{
/* Ask the user to login */
final LoginFrame login;
login = new LoginFrame(new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent event)
{
switch (event.getActionCommand())
{
case "login":
/* @todo Login the user */
String username = login.getUsername();
String password = login.getPassword();
}
}
});
login.display();
}
我的登录框架采用ActionListener。如何从new ActionListener() 中访问login?
现在我收到一个错误:
变量登录可能尚未初始化。
【问题讨论】:
标签:
java
actionlistener
inner-classes
anonymous-inner-class
【解决方案1】:
AFAIK 你不能因为 ActionListener 将首先创建,那时必须有权访问尚未初始化的最终变量 login。
调用顺序如下:
- 创建
ActionListener 的实例
- 将该实例传递给
LoginFrame 构造函数
- 将创建的帧分配给
login
现在假设 ActionListener 构造函数将访问 login - 它还没有被初始化并且会导致错误。
要解决此问题,您需要先创建框架,然后设置ActionListener,即
final LoginFrame login = new LoginFrame();
login.addActionListener( new ActionListener() { ... } );
【解决方案2】:
您必须在创建 LoginFrame 后分配 ActionListener。
赋值的右侧首先或在 login 字段被赋值之前进行评估,正如编译器告诉你的那样。
listeners 更常见的是有一个add 方法,所以我将代码更改为:
private final login = new LoginFrame();
login.addActionListener(
new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent event)
{
switch (event.getActionCommand())
{
case "login":
/* @todo Login the user */
String username = login.getUsername();
String password = login.getPassword();
}
}
}
);
login.display();
【解决方案3】:
你还没有初始化你的变量login,你正在使用它。
通过您的anonymous class,您正在初始化变量,因此您可以在初始化后使用它。如果你想使用这个变量,你必须初始化它(但永远不要用null值初始化你的变量,因为你使用的是LoginFrame类的方法,它必须抛出NullPointerException)。