繁体   English   中英

从匿名类参数访问类的实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM