将参数传递给Java中方法内部定义的方法
所以情况是这样的:将参数传递给Java中方法内部定义的方法,java,methods,abstract,overriding,Java,Methods,Abstract,Overriding,所以情况是这样的: 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() { f
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();
}
但是如果我想把一个参数传递给那个内部方法呢
例如
给我:类型new Runnable(){}必须实现继承的抽象方法Runnable.run()
当
告诉我Runnable类型中的run()方法不适用于参数(int)不,它不是一个方法,而是一个匿名对象。可以为对象创建一个额外的方法
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){ }
}
不,那不是一个方法,而是一个匿名对象。可以为对象创建一个额外的方法
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){ }
}
看起来您只需要内部方法。Java不允许您拥有它们,因此您描述的
Runnable
hack允许您声明一个内部方法
但是既然你想要更多的控制权,为什么不定义你自己的:
interface Inner<A, B> {
public B apply(A a);
}
接口内部{
公共B申请(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);
private void myMethod(..){
最终内部=新内部(){
公共整数应用(整数i){
//随便你
}
};
//然后去:
内部。应用(1);
内部。应用(2);
}
或者使用提供
functor
对象的库。应该有很多。Apache Commons有一个可以使用的Functor。看起来您只需要内部方法。Java不允许您拥有它们,因此您描述的Runnable
hack允许您声明一个内部方法
但是既然你想要更多的控制权,为什么不定义你自己的:
interface Inner<A, B> {
public B apply(A a);
}
接口内部{
公共B申请(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);
private void myMethod(..){
最终内部=新内部(){
公共整数应用(整数i){
//随便你
}
};
//然后去:
内部。应用(1);
内部。应用(2);
}
或者使用提供
functor
对象的库。应该有很多。Apache Commons有一个可以使用的Functor。好吧,我一点也不清楚为什么这涉及到可运行程序和可能的多线程-你能澄清一下吗?你知道Runnable
是一个用于多线程的预定义接口吗?为什么不创建自己的接口呢?这是我发现的在Java中实现方法中的方法的唯一解决方案。但是为什么要在方法中实现方法呢?Runnable并不是为此目的而设计的()。您是否尝试定义自己的接口而不是使用Runnable?这样你就有了你所需要的所有自由度。好吧,我一点也不清楚为什么这涉及到可运行性和可能的多线程-你能澄清一下吗?你知道Runnable
是一个用于多线程的预定义接口吗?为什么不创建自己的接口呢?这是我发现的在Java中实现方法中的方法的唯一解决方案。但是为什么要在方法中实现方法呢?Runnable并不是为此目的而设计的()。您是否尝试定义自己的接口而不是使用Runnable?这样你就有了你所需要的所有自由度。或者使用一个非匿名类和一个构造函数来获取感兴趣的参数值。这是可行的,但我不确定它是否能长期帮助OP。为此使用Thread/Runnable感觉非常错误,更不用说start()可能产生的副作用了。@Jerome不幸的是,OP没有解释他或她为什么希望这样做。或者使用一个非匿名类和一个接受感兴趣的参数值的构造函数。这是可行的,但我不确定它对OP有长期的帮助。为此使用Thread/Runnable感觉非常错误,更不用说start()可能产生的副作用了。@Jerome不幸的是,OP没有解释他或她为什么希望这样做。public B apply(a)代码>-这是打字错误吗?你的意思是公共B应用(A)
?另外-我认为您在实现中缺少了一些东西-代码给了我类型new InnerMethod(){}必须实现继承的抽象方法InnerMethod.apply(Object)
是的,很抱歉。我应该把它标记为未经测试的代码。现在修复了。嗯-如果我想创建一个void方法,我将如何编写它?(或传入无效参数?。public B apply(a)代码>-这是打字错误吗?你的意思是公共B应用(A)
?另外-我认为您在实现中缺少了一些东西-代码给了我类型new InnerMethod(){}必须实现继承的抽象方法InnerMethod.apply(Object)
是的,很抱歉。我应该把它标记为未经测试的代码。现在修复了。嗯-如果我想创建一个void方法,我将如何编写它?(或传入一个void参数?)。