【问题标题】:Is it possible to pass a method body as a parameter in Java?是否可以在 Java 中将方法体作为参数传递?
【发布时间】:2023-03-09 03:50:01
【问题描述】:

我正在做一些安卓编程。我正在向视图添加按钮。每个按钮都有自己的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 的建议之后,是否可以在有通用方法的情况下执行类似下面的操作,只将主体作为参数?

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

【问题讨论】:

标签: java android methods parameter-passing


【解决方案1】:

使用 Java 8 拉姆达斯:

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

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

要在 Android Studio 中启用此功能,请在 build.gradle (app) 中添加以下代码块

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

【讨论】:

    【解决方案2】:

    您可以使用 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
    }
    

    【讨论】:

      【解决方案3】:

      将 OnClickListener 实现作为参数传递,阅读 Strategy Design Pattern

      【讨论】:

      • 这可以是评论而不是答案。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      相关资源
      最近更新 更多