有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将一个具体方法作为参数传递给另一个具体方法

我是java的新手,正在开发一个真实的项目。到目前为止,我有很多方法和大约2500行代码。许多方法略有不同(通常只是一个标识符的差异),因此我不得不一次又一次地复制代码,并做一些细微的更改。 我想要的是将一个方法作为参数传递给另一个方法,我已经经历了lambda表达式 但由于我自己在概念上的缺陷,我觉得它不够吸引人。因为它告诉我们要定义要传递的每个方法的函数接口。但按照我的想法,它不会给我一个通用代码,这样我将来就可以简单地添加一些其他表

我正在写一段代码来演示和更好地解释我的问题

if(houseTabPanel.getComponentCount()==0){
                     houseTableDb();
                    }
                    if(isSelected){
                        selection(houseTable);
                    }
                    else {
                        houseTable.setColumnSelectionAllowed(false);
                        houseTable.setRowSelectionAllowed(false);
                        houseTable.setCellSelectionEnabled(false);
                        Rselection(houseTable);
                    }

现在我有了不同的方法,名为houseTableDb()、plotTableDb()、adminTableDb()等等。 我想为这段代码创建一个方法,并将plotTableDb()等作为参数传递。。 比如

public void genericMethod(JPanel p, JTable t, some method reference to use instead of houseTableDb){}

如果我描述得不够详细,请原谅。。任何回应都会受到内心深处的感激


共 (2) 个答案

  1. # 1 楼答案

    你可以这样做:

    public void genericMethod(JPanel p, JTable t, TableDbCallBack tableDb)
    {
        if(p.getComponentCount()==0)
        {
            tableDb.run();
        }
        if(isSelected)
        {
            selection(t);
        }
       else
       {
            t.setColumnSelectionAllowed(false);
            t.setRowSelectionAllowed(false);
            t.setCellSelectionEnabled(false);
            Rselection(t);
        }
    }
    

    用法:

    genericMethod(p, t, new HouseTableDb());
    genericMethod(p, t, new AdminTableDb());
    

    实施:

    public interface TableDbCallBack extends Runnable {}
    
    public class HouseTableDb implements TableDbCallBack
    {
        @Override
        public void run()
        {
             // Whatever it should do   
        }
    } 
    
    public class AdminTableDb implements TableDbCallBack
    {
        @Override
        public void run()
        {
             // Whatever it should do   
        }
    } 
    
  2. # 2 楼答案

    如果所有这些方法都具有相同的签名,则可以使用具有该签名(返回值、参数列表)的单个方法定义接口。然后编写实现该方法的类,每个类对应一个方法的实现。要传递该方法,需要创建该类的对象并传递该对象。对实际方法的调用将替换为对接口中定义的方法的调用

    interface Callee {
        void meth();
    }
    class MethOne implements Callee {
        public void meth(){...}
    }
    
    void caller( Callee callee ){
        callee.meth();
    }
    
    Callee ofOne = new MethOne();
    caller( ofOne );
    

    但为了避免所有这些混乱:这就是为什么添加了Lambda