@Ertdf

Что использовать throw + try/catch или if + return?

Всем доброго времени суток!
Имеется приложение "Телефонная книга" на JavaFX. Оно состоит из двух форм(Stage).
На первой таблица и три кнопки: добавить, изменить, удалить. В таблице хранятся объекты типа Person с двумя полями: fio и phone. Вторая для ввода или изменения данных из таблицы, содержит две кнопки "Сохранить" и "Отмена".
Формы: mainPane.fxml, addPane.fxml. Два контроллера (классы с обработчиками событий) к ним: MainPaneController.java и AddPaneController.java соответственно.

Контроллер для главного окна выглядит следующим образом:
public class MainPaneController {
	
	....
	
	private AddPaneController addPaneController;
	//Коллекция объектов Person - записей телефонной книги
	private CollectionAddressBook addressBookImpl = new CollectionAddressBook();
	...
	
	@FXML
	private void initialize(){
		...
		addPaneController = fxmlLoader.getController();
		addressBookImpl.fillPersonList();
	}
	
	...
	
	@FXML 
    private void actionButtonPressed(ActionEvent actionEvent){
        Object source  = actionEvent.getSource();

        if (!(source instanceof Button)) return;

        Button clickedButton = (Button) source;

        try {
            switch (clickedButton.getId()){

                case "btnAdd":
                    addPaneController.setPerson(new Person());
                    showDialog(TypeDialog.ADD);
                    addressBookImpl.add(addPaneController.getPerson());
                    break;

                case "btnEdit":
                    Person selectedPerson = (Person)tableAddresBook.getSelectionModel().getSelectedItem();
                    addPaneController.setPerson(selectedPerson);
                    showDialog(TypeDialog.UPDATE);
                    break;

                case "btnDelete": break;
            }
        }
        catch (EmptyPersonException e){}
        catch (NullPersonException e){
            DialogManager.showErrorDialog(e.getMessage());
        }

    }
	
	...
	
	private void showDialog(TypeDialog typeDialog) {
		// Отображает форму addPane.fxml
	}
}


Класс контроллера для окна добавления/изменения записей в таблице:
public class AddPaneController {

    private Person person;

    @FXML
    private TextField txtFIO, txtPhone;


    public void setPerson(Person person) throws NullPersonException {
        if (person ==  null)
            throw new NullPersonException();

        this.person = person;
        txtFIO.setText(person.getFio());
        txtPhone.setText(person.getPhone());
    }

    public Person getPerson(){
        return person;
    }

    //region LISTENERS
	//для кнопки "Отмена"
    @FXML
    public void actionClose(ActionEvent actionEvent){
        Node source = (Node)actionEvent.getSource();
        Stage stage = (Stage)source.getScene().getWindow();
        stage.hide();
    }
	
	//для кнопки "Сохранить"
    @FXML
    public void actionSave(ActionEvent actionEvent) {
        try {
            person.setFio(txtFIO.getText());
            person.setPhone(txtPhone.getText());
            actionClose(actionEvent);
        }
        catch (EmptyPersonException e){
            DialogManager.showErrorDialog(e.getMessage());
        }
    }
    //endregion
}


Класс Person:
public class Person {

    private SimpleStringProperty fio = new SimpleStringProperty("");
    private SimpleStringProperty phone = new SimpleStringProperty("");

    public Person(){}

    public Person(String fio, String phone) {
        this.fio.set(fio);
        this.phone.set(phone);
    }

    public String getFio() {
        return fio.get();
    }

    public String getPhone() { return phone.get(); }

    public void setFio(String fio) throws EmptyPersonException {
        if (fio.length() == 0)
            throw new EmptyPersonException();
        this.fio.set(fio);
    }

    public void setPhone(String phone) throws EmptyPersonException{
        if (phone.length() == 0)
            throw new EmptyPersonException();
        this.phone.set(phone);
    }

}


Класс CollectionAddressBook:
public class CollectionAddressBook implements IAddressBook {

    private ObservableList<Person> personList = FXCollections.observableArrayList();

    @Override
    public void add(Person person) throws EmptyPersonException {
        if (person.getFio().length() == 0 || person.getPhone().length() == 0)
            throw new EmptyPersonException();
        personList.add(person);
    }
	
	...

    public ObservableList<Person> getPersonList(){ return  personList;}

    public void fillPersonList(){
        personList.add(new Person("Артем","8 800 555 3535"));
        personList.add(new Person("Василий","8 802121 3535"));
        personList.add(new Person("Нина","8 23222390 3535"));
    }
}


Эксцепшены:
public class EmptyPersonException extends Exception {
    public EmptyPersonException(){
        super("Не все поля заполненны!");
    }
}

public class NullPersonException extends Exception {
    public NullPersonException(){
        super("Не выбрана запись из списка!");
    }
}


Вопрос: насколько употребимо в данной ситуации (для проверки заполненности полей объекта Person) применение механизма исключений?
Может быть стоило использовать if и return, к примеру?
@FXML 
    private void actionButtonPressed(ActionEvent actionEvent){
        Object source  = actionEvent.getSource();

        if (!(source instanceof Button)) return;

        Button clickedButton = (Button) source;

		
		switch (clickedButton.getId()){

                case "btnAdd":
					addPaneController.setPerson(new Person());						
                    showDialog(TypeDialog.ADD);
					if (person.getFio().length() == 0 || person.getPhone().length() == 0){
						DialogManager.showErrorDialog("Не все поля заполненны!");
						return;
					}
					else
						addressBookImpl.add(addPaneController.getPerson());
                    break;

                case "btnEdit":
                    Person selectedPerson = (Person)tableAddresBook.getSelectionModel().getSelectedItem();
					if (selectedPerson == null){
						DialogManager.showErrorDialog("Не выбрана запись из списка!");
						return;
					}
					else{
						addPaneController.setPerson(selectedPerson);
						showDialog(TypeDialog.UPDATE);	
					}
                    break;

                case "btnDelete": break;
        }
    }


Какой из двух способов реализации метода actionButtonPressed лучше и почему? Что можете сказать про мой код?:) Принимаю любую критику. Заранее спасибо.
  • Вопрос задан
  • 888 просмотров
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev
software engineer
Разница между if/else в том, что его нужно каждый раз после каждой операции на каждом ее этапе ставить, чтобы делать проверку.

А try/catch вы вешаете на весь блок, причем сразу отлавливаете разные события.

Если для вас важна производительность, то if/else быстрее
Ответ написан
Комментировать
@poslannikD
Java/C/C++ Programmer
Решать вам :)
1) try/catch - не рекомендуется использовать в цикле так как данная конструкция снижает производительность.
2) if/else - гораздо быстрее
НО
У вас в программе нет циклов на 1_000_000 итераций в которых используется try/catch, а значит лично для вашей приложухи это будет незаметно.
Что лично для вас как разработчика удобнее то и используйте.
Ответ написан
Комментировать
@EvgeniiR
https://github.com/EvgeniiR
Вопрос: насколько употребимо в данной ситуации (для проверки заполненности полей объекта Person) применение механизма исключений?
Может быть стоило использовать if и return, к примеру?

Ни то ни другое.
Стоило бы использовать Notification.
Тут статья про сравнение с механизмом исключений
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы