我是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){}
如果我没有足够的描述性,请原谅我。任何回应都会被内心的核心所感激。
答案 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
}
}