[英]Access an instance of a class from anonymous class argument
我似乎无法通过网站上的所有匿名内部类问题找到答案。
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
?
现在我收到一个错误:
变量登录可能尚未初始化。
AFAIK你不能,因为ActionListener
将首先创建,并且在那时必须有权访问尚未初始化的最终变量login
。
通话顺序如下:
ActionListener
的实例 LoginFrame
构造函数 login
现在假设ActionListener
构造函数将访问login
- 它不会被初始化并且会导致错误。
要解决此问题,您需要先创建框架,然后设置ActionListener
,即
final LoginFrame login = new LoginFrame();
login.addActionListener( new ActionListener() { ... } );
在创建LoginFrame
之后,您必须分配ActionListener
。
在编译器告诉您的情况下,首先或在分配login
字段之前评估赋值的右侧。
对于监听器来说,更常见的是有一个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();
您尚未初始化变量login
并且正在使用它。
通过您的anonymous class
,您正在初始化您的变量,因此您可以在初始化它之后使用它。 如果你想使用这个变量,你必须初始化它(但是永远不要用null
值初始化你的变量,因为你使用的是LoginFrame
类的方法,它必须抛出NullPointerException
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.