0

所以情况是这样的:

private void myMethod()
{
    System.out.println("Hello World"); //some code

    System.out.println("Some Other Stuff"); 

    System.out.println("Hello World"); //the same code. 

}

我们不想重复我们的代码。

这里描述的技术效果很好:

private void myMethod()
{
    final Runnable innerMethod = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello World"); 
        }
    };

    innerMethod.run();
    System.out.println("Some other stuff"); 
    innerMethod.run(); 
}

但是,如果我想将参数传递给该内部方法怎么办?

例如。

private void myMethod()
{
    final Runnable innerMethod = new Runnable()
    {

        public void run(int value)
        {
            System.out.println("Hello World" + Integer.toString(value)); 
        }
    };

    innerMethod.run(1);
    System.out.println("Some other stuff"); 
    innerMethod.run(2); 
}

给我:The type new Runnable(){} must implement the inherited abstract method Runnable.run()

尽管

private void myMethod()
{
    final Runnable innerMethod = new Runnable()
    {
        public void run()
        {
            //do nothing
        }

        public void run(int value)
        {
            System.out.println("Hello World" + Integer.toString(value)); 
        }
    };

    innerMethod.run(1);
    System.out.println("Some other stuff"); 
    innerMethod.run(2); 
}

给我The method run() in the type Runnable is not applicable for the arguments (int)

4

2 回答 2

3

不,这不是一个方法,而是一个匿名对象。您可以为该对象创建一个额外的方法。

 Thread thread = new Thread(  new Runnable()
    {
      int i,j;
      public void init(int i, int j)
      {
        this.i = i;
        this.j=j;
      }
    });
thread.init(2,3);
thread.start();

并将runnable包装在一个线程中,然后调用start!不是run()。因为你不能调用匿名类的构造函数,正如@HoverCraft 所指出的,你可以扩展一个实现的命名类Runnable

public class SomeClass implements Runnable
{
   public SomeClass(int i){ }
}
于 2012-11-20T03:57:34.670 回答
2

看起来你只想要内部方法。Java 不允许您拥有它们,因此Runnable您描述的 hack 可以让您在某种程度上声明一个内部方法。

但是既然你想要更多地控制它,为什么不定义你自己的:

interface Inner<A, B> {
    public B apply(A a);
}

然后你可以说:

private void myMethod(..){ 
    final Inner<Integer, Integer> inner = new Inner<Integer, Integer>() {
        public Integer apply(Integer i) {
            // whatever you want
        }
    };


    // then go:
    inner.apply(1);
    inner.apply(2);

}

或者使用一些提供functor对象的库。应该有很多。Apache Commons 有一个可以使用的 Functor。

于 2012-11-20T04:07:58.390 回答