2011-05-21 40 views
2

创建方法:与我刚刚发现这个方法函数参数

new Thread(
      new Runnable() { 
       public void run() { 
        try { 
         // MY CODE 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }).start(); 

我不知道如果我可以创建一个参数的方法是,我会投入到//我的代码的功能。我可以这样做吗?和如何:)

回答

4

Java不支持(它可以作为参数被传递或从方法返回即函数)第一类函数。

但是你可以使用策略模式的某种变体来代替:创建一些接口Executable与方法execute,并通过它的匿名实现作为参数:

interface Executable { 

    void execute(); 
} 

... 
void someMethod(final Executable ex) { 
//here's your code 
     new Thread(
      new Runnable() { 
       public void run() { 
        try { 
         ex.execute(); // <----here we use passed 'function' 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
     }).start(); 
} 

... 

//here we call it: 

someMethod(new Executable() { 
    public void execute() { 
     System.out.println("hello"); // MY CODE section goes here 
    } 
}); 
+0

C#支持吗?对不起,但我想知道它:) – nXqd 2011-05-21 07:00:18

+1

@nXqd:比Java更大的程度。 C#有委托人,这是一类公民。你最好单独提问,熟悉C#的人会给你一个很好的答案。 – Roman 2011-05-21 07:04:03

2

这实际上是创建一个匿名类对象(实现Runnable接口)。所以你只传递类对象。这只是一种速记符号。

这对于您不打算重用/引用您的调用代码内再次创建该对象的情况下特别有用。

现在对于你的问题 - 你可以创造出期望的对象的功能,如上文所述,同时呼吁你可以传递所需的对象/匿名类对象。

1

更高层次的语言,如Common Lisp的和Python有first-class functions,这是你在找什么。 Java没有这个功能。相反,你必须使用接口。 C和C++允许将函数指针作为参数传递。 C++也有function objects

相关问题