如何在匿名类中为返回void的方法返回String

时间:2013-02-10 13:21:51

标签: java

我有点困惑。我有以下内容:

public static String showInputDialog() {
   Form frm = new Form();
   final Command cmd = new Command("Ok");
   final TextField txt = new TextField("Enter the text", null, 1024, 0);
   frm.addCommand(cmd);
   frm.append(txt);
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                return txt.getString(); // Error !!
            } else {
                return null; // Error !!
            }
       }
   });
}

如您所见,我想返回输入对话框字符串,而匿名类方法应该返回void。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

这不符合您的预期。

我看到已经有一些解决方案,但我觉得对实际发生的事情进行更多讨论可能会有所帮助。

当您调用frm.setCommandListener(new CommandListener() { ... })时,代码会向用户显示一个对话框,在该对话框中,她可以键入一些文本并提交,但代码不会停止并等到用户完成。 相反,代码继续执行 - 而不会产生结果。只有在用户完成输入并提交后,才会回调处理结果 - 这可能会在以后发生,或者根本不会发生。

我猜你有一些代码调用这个方法,如:

public void someMethod(int foo, String bar) {

   [...]
   String result = MyInputForm.showInputDialog();
   // do something with the result
   System.out.println("hey, got a result "+ result);
   [...]
}

相反,你需要重组这个。首先编写一个处理结果的辅助类:

公共静态类MyCallBack {

   public MyCallBack(... /* here pass in what you need to process the result*/) {
      ... remember necessary stuff in instance variables
   }

   public void processResult(String result) {
      // do something with the result
      System.out.println("hey, got a result "+ result);
      [...]
   }

}

然后主叫方只做:

public void someMethod(int foo, String bar) {

   [...]
   MyInputForm.showInputDialog( new MyCallBack(... here pass in stuff ...) );
   [...]
}

并且实际代码必须更改为:

public static String showInputDialog(final MyCallBack callback) {
   Form frm = new Form();
   final Command cmd = new Command("Ok");
   final TextField txt = new TextField("Enter the text", null, 1024, 0);
   frm.addCommand(cmd);
   frm.append(txt);
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                return callback.processResult(txt.getString());
            } else {
                return; // or just omit the else part
            }
       }
   });
}

两个问题:

  • 这种编程方式感觉非常倒退,但它确实是它的工作方式。
  • 感觉不对的是我需要定义除CommandListener之外的第二个辅助类。那真的不是好风格。我希望它可以改进,但由于我没有看到完整的代码(无论如何都是太多的信息),我不得不留给你改进代码并摆脱杂乱。虽然我觉得你想要一个模块化的,可重复使用的输入对话帮助器,但这可能不是最好的方法;更好地直接在需要结果的位置定义FormTextFieldCommand并使其运行。让它运行后,让它在第二步中重复使用。

答案 1 :(得分:0)

鉴于CommandListener is fixed,有两种可能的选择

在外部类中使用类成员变量&分配给该变量

private static String myText;
...

public static String showInputDialog() {
   ...
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                myText = txt.getString(); 
            } else {
                myText = null;
            }
       }
   });
}

或创建CommandListener的具体实现,并将返回值设置为新实现的属性

我想看一下在这个片段非静态中制作方法/变量......

答案 2 :(得分:0)

如果您使用String执行某些操作或将其存储在某处,则无需返回它,例如:

static String result;

public String commandAction(Command c, Displayable d) {
    if (c == cmd) {
        result = txt.getString();
    } else {
        result = null;
    }
}

虽然您需要处理线程问题。

答案 3 :(得分:0)

你不能返回字符串,因为你不知道何时会调用监听器。 一旦你有了字符串,你就可以用它做点什么。

public static void showInputDialog() {

   StringHandler sh = new StringHandler();

   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                sh.handle(txt.getString()); 
            } else {
                sh.handle(null);
            }
       }
 });}


public class StringHandler {
    public void handle(String s){
        // Do something with that string.
    }
}