是否可以在Java中将方法主体作为参数传递?

时间:2019-06-16 10:37:57

标签: java android methods parameter-passing

我正在做一些android编程。我正在向视图添加按钮。每个按钮的onClick函数都有其自己的行为。但是代码似乎是重复的。例如:

// the view
View v = new View(this);
// first button
Button b1 = new Button(this);
b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // some method body1
            }
        });
v.addView(b1);

// second button
Button b2 = new Button(this);
b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // some method body2
            }
        });
v.addView(b2);

// nth button
// ...

是否有更简洁的方法向视图添加按钮,例如将方法主体传递给方法或其他方法?例如:

public void addButton(MethodBody methodBody)
{
   Button b = new Button(this);
   b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                methodBody
            }
        });
   v.addView(b);
}

编辑:因此,在看到lambda的建议之后,是否可以像下面这样做某事,那里有一个通用方法,只是将body作为参数?

public void addButton(MethodBody methodBody)
{
   Button b = new Button(this);
   b.setOnClickListener(v -> 
      {
          methodBody
      }
   );
   v.addView(b);
}

编辑2:我想我们可以做到

// general method
public void addButton(OnClickListener onClickListener)
{
    Button button = new Button(this);
    // other stuff
    button.setOnClickListener(onClickListener);
    v.addView(button);
}

// run the method
addButton(v -> {
            // some body
        });

3 个答案:

答案 0 :(得分:2)

使用 Java 8 Lamdas:

b1.setOnClickListener((View v) -> {
    // // some method body1
});

b2.setOnClickListener((View v) -> {
    // // some method body2
});

要在Android Studio中启用此功能,请在 build.gradle(应用程序)

中添加以下代码块
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

答案 1 :(得分:1)

您可以使用Java 8的method references

void onCreate(){
    //...
    findViewById(R.id.btn1).setOnClickListener(this::handleBtn1Click);
    findViewById(R.id.btn2).setOnClickListener(this::handleBtn2Click);
    findViewById(R.id.btn3).setOnClickListener(this::handleBtn3Click);
}

void handleBtn1Click(View view){
    // handle btn1 click here
}

void handleBtn2Click(View view){
    // handle btn2 click here
}

void handleBtn3Click(View view){
    // handle btn3 click here
}

答案 2 :(得分:0)

将OnClickListener实现作为参数传递,请参见Strategy Design Pattern