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

时间:2014-11-19 08:18:51

标签: java methods arguments

我是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 个答案:

答案 0 :(得分:1)

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

interface Callee {
    void meth();
}
class MethOne implements Callee {
    public void meth(){...}
}

void caller( Callee callee ){
    callee.meth();
}

Callee ofOne = new MethOne();
caller( ofOne );

但为了避免这一切的骚扰:这就是为什么添加了lambdas ......

答案 1 :(得分:0)

你可以这样做:

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   
    }
}