2017-02-23 201 views
1

В двух разных классах у меня тот же код, что и ниже. Этот раздел кода позволяет мне добавить экран предупреждения, когда пользователь закрывает окно. Каков наилучший способ избежать написания одной и той же вещи дважды?Устранение дублированного кода в разных классах

public void addWindowEventHandlers() { 
    view.getScene().getWindow().setOnCloseRequest(new EventHandler<WindowEvent>() { 
     @Override 
     public void handle(WindowEvent event) { 
      Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
      alert.setHeaderText("You are about to exit the game."); 
      alert.setContentText("Are you sure?"); 
      alert.setTitle("Warning"); 
      alert.getButtonTypes().clear(); 
      ButtonType no = new ButtonType("No"); 
      ButtonType yes = new ButtonType("Yes"); 
      alert.getButtonTypes().addAll(no, yes); 
      alert.showAndWait(); 
      if (alert.getResult() == null || alert.getResult().equals(no)) { 
       event.consume(); 
      } 
     } 
    }); 
} 

Небольшое примечание: для этого проекта мне нужно работать с презентатором модели.

+1

Извлечь метод рефакторинга: https: //refactoring.guru/smells/duplicate-code –

+1

И если он не находится в том же классе: https://refactoring.com/catalog/replaceMethodWithMethodObject.html –

+0

У ваших двух классов есть общий суперкласс, который вы можете изменить? Если это так, поместите функциональность в метод там и вызовите его из подклассов. –

ответ

1

Почему бы просто не сделать обработчик автономный класс (или публичный статический внутренний класс в другом удобном классе):

public class CloseWindowConfirmation implements EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
     alert.setHeaderText("You are about to exit the game."); 
     alert.setContentText("Are you sure?"); 
     alert.setTitle("Warning"); 
     alert.getButtonTypes().clear(); 
     ButtonType no = new ButtonType("No"); 
     ButtonType yes = new ButtonType("Yes"); 
     alert.getButtonTypes().addAll(no, yes); 
     alert.showAndWait(); 
     if (alert.getResult() == null || alert.getResult().equals(no)) { 
      event.consume(); 
     } 
    } 
} 

Тогда вы просто делаете

public void addWindowEventHandlers() { 
    view.getScene().getWindow().setOnCloseRequest(new CloseWindowConfirmation()); 
} 
+0

Спасибо @James_D;) Еще один вопрос, как я могу извлечь метод, если в нем есть переменные? Например: if (alert.getResult(). Equals (yes)) { view.getTextField(); view.getScene(). GetWindow(). Hide(); } – m4t5k4

+0

Просто введите значение, которое вам нужно для свойства класса обработчика и передайте его конструктору. –

Смежные вопросы