Java 定义方法数组

Java 定义方法数组,java,lambda,Java,Lambda,我正在做一个小的图像处理程序。它有一个GUI,我想将每个按钮绑定到不同的方法。为了做到这一点,我决定创建一个方法数组,但是,到目前为止,我无法让它工作。我尝试过使用匿名类,但它对我不起作用。我的代码: public class ImageProcessor { void blur(){ System.out.println("blurring"); } void sharpen(){ System.out.println("sharpeni

我正在做一个小的图像处理程序。它有一个GUI,我想将每个按钮绑定到不同的方法。为了做到这一点,我决定创建一个方法数组,但是,到目前为止,我无法让它工作。我尝试过使用匿名类,但它对我不起作用。我的代码:

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我在答案的底部添加了一条关于这一点的评论。我认为您需要一次只注册一个处理器,以执行特定操作。在我看来,不需要数组。