Можно ли передать тело метода в качестве параметра в Java? - PullRequest
2 голосов
/ 16 июня 2019

Я занимаюсь программированием 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);
}

РЕДАКТИРОВАТЬ: Таким образом, увидев предложения для лямбда, можно ли сделать что-то вроде ниже, где есть общий метод и просто принять тело в качестве параметра?

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 ]

2 голосов
/ 16 июня 2019

Использование 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
    }
1 голос
/ 16 июня 2019

Вы можете использовать ссылки на метод в Java 8 .

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
}
0 голосов
/ 16 июня 2019

Передайте реализацию OnClickListener в качестве параметра, прочитайте о Шаблон проектирования стратегии

...