Java 定义方法数组
我正在做一个小的图像处理程序。它有一个GUI,我想将每个按钮绑定到不同的方法。为了做到这一点,我决定创建一个方法数组,但是,到目前为止,我无法让它工作。我尝试过使用匿名类,但它对我不起作用。我的代码:Java 定义方法数组,java,lambda,Java,Lambda,我正在做一个小的图像处理程序。它有一个GUI,我想将每个按钮绑定到不同的方法。为了做到这一点,我决定创建一个方法数组,但是,到目前为止,我无法让它工作。我尝试过使用匿名类,但它对我不起作用。我的代码: public class ImageProcessor { void blur(){ System.out.println("blurring"); } void sharpen(){ System.out.println("sharpeni
public class ImageProcessor {
void blur(){
System.out.println("blurring");
}
void sharpen(){
System.out.println("sharpening");
}
}
public class GUI {
private ImageProcessor imager = new ImageProcessor();
private ImageProcessor[] LAMBDAS = new ImageProcessor[]{
public void blur(){imager.blur();}} // one of my failed attempts
}
例如,一旦按下模糊按钮,我想将数组的第一项绑定到它,在本例中是模糊方法。任何指点都将不胜感激 我认为这行不通 您可以使用反射,请参阅Oracle的本教程:
然而,我只有在真正必要的时候才会这样做,因为这样可以避免编译时的许多检查,并且比正常的方法调用运行得慢。我认为这是行不通的 您可以使用反射,请参阅Oracle的本教程:
但是,只有在真正必要的情况下,我才会这样做,因为这将避免编译时的许多检查,并且运行速度比正常方法调用慢。您正在创建数组,但您还必须使用
new
关键字在外部大括号内创建新的ImageProcessor
对象:
class GUI {
private ImageProcessor imager = new ImageProcessor();
private ImageProcessor[] LAMBDAS = new ImageProcessor[] {
//LAMBDAS[0]
new ImageProcessor() {
public void blur() {
imager.blur();
}
},
//LAMBDAS[1]
new ImageProcessor() {
public void blur() {
imager.blur();
}
} };
}
如果愿意,还可以省略数组初始化语法的新ImageProcessor[]
部分,只需使用大括号即可
上面提到的只是导致编译器错误的语法错误。作为旁注,这不是事件处理程序通常绑定到源的方式。在这种情况下,数组对您没有帮助。例如,如果有多个按钮使用不同的参数执行类似的事件,那么可能需要一个数组。
但是,在您的情况下,通过添加侦听器而不编译
ImageProcessor
对象数组来注册事件就足够了,每个ImageProcessor
只做一件事(即blur()
,锐化()
,等等)。您正在创建数组,但您还必须使用new
关键字在外部大括号内创建新的ImageProcessor
对象:
class GUI {
private ImageProcessor imager = new ImageProcessor();
private ImageProcessor[] LAMBDAS = new ImageProcessor[] {
//LAMBDAS[0]
new ImageProcessor() {
public void blur() {
imager.blur();
}
},
//LAMBDAS[1]
new ImageProcessor() {
public void blur() {
imager.blur();
}
} };
}
如果愿意,还可以省略数组初始化语法的新ImageProcessor[]
部分,只需使用大括号即可
上面提到的只是导致编译器错误的语法错误。作为旁注,这不是事件处理程序通常绑定到源的方式。在这种情况下,数组对您没有帮助。例如,如果有多个按钮使用不同的参数执行类似的事件,那么可能需要一个数组。
但是,在您的情况下,只需添加一个侦听器,而无需编译
ImageProcessor
对象数组,注册事件就足够了,每个ImageProcessor
只做一件事(即blur()
,锐化()
,等等)。您的ImageProcessor
不是lambda。它更像是Runnable lambda=()->imager.blur()代码>。但是阵列似乎有点不相关……您可能希望继续您的设计。您的ImageProcessor
不是lambda。它更像是Runnable lambda=()->imager.blur()代码>。但是数组似乎有点不相关…你可能想继续你的设计。我明白了。谢谢你的回复。你知道我怎样才能实现类似于我所追求的东西吗?不,除非你使用反射,但那离你的阵列很远。我明白了。谢谢你的回复。你知道我该如何实现类似于我所追求的东西吗?没有,除非你使用反射,但那离你的阵列很远。谢谢!你认为这是一个好的解决方案吗?我觉得最终我可能会添加很多动作,所以很多新对象对我来说都是错误的。也许我应该放弃这个想法,重新设计?@Omri.B我在答案的底部添加了一条关于这一点的评论。我认为您需要一次只注册一个处理器,以执行特定操作。在我看来,不需要阵列。谢谢!你认为这是一个好的解决方案吗?我觉得最终我可能会添加很多动作,所以很多新对象对我来说都是错误的。也许我应该放弃这个想法,重新设计?@Omri.B我在答案的底部添加了一条关于这一点的评论。我认为您需要一次只注册一个处理器,以执行特定操作。在我看来,不需要数组。