【问题标题】: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)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-08
          • 1970-01-01
          相关资源
          最近更新 更多