Помогите сделать метод и его вызвать

269
14 мая 2017, 23:08

Здравствуйте, я новичок в java, не могли бы вы мне помочь можно ли из этого кода сделать метод и потом вызывать его, а так он очень уж громоздкий, и как это сделать? Тут я создаю диалог со списком и обрабатываю нажатие на элемент диалога.

@Override
protected Dialog onCreateDialog(int id) {
    switch (id){
        case KEY:
            AlertDialog.Builder b = new AlertDialog.Builder(Stop1.this);
            b.setTitle("Пересадка");
            b.setPositiveButton("Отмена", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            b.setItems(city, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int position) {
                    switch(position) {
                        case 0:
                            startActivity(new Intent(Stop1.this, number_11.class));
                            break;
                    }
                }
            });
                return b.create();
            default:
                return  null;
    }
}
Answer 1

Рекомендуемая литература: Роберт Мартин. Чистый код: создание, анализ и рефакторинг. Библиотека программиста. - СПб.: Питер, 2010. - 464 с.: ил.

Как вам правильно уже указали в комментарии - ваш код уже является методом, который можно вызвать, его нужно отрефакторить.

Например, это может выглядеть так (простите за возможные неточности по синтаксису, мой "родной" язык C#):

1 Возможно нужно вообще избавиться от корневого switch и заменить его на if, но так как я вижу, что там используется именованная константа, пока воздержусь от такого рефакторинга, т. к. возможно в дальнейшем будут добавлены еще ветки.

2 Избавляемся от вложенности (хорошие имена для методов вы должны будете придумать самостоятельно, т. к. мне неизвестен весь контекст):

@Override
protected Dialog onCreateDialog(int id) {
    switch (id){
        case KEY:
            return createKeyDialog();
        default:
            return  null;
    }
}
private Dialog createKeyDialog() {
    AlertDialog.Builder b = new AlertDialog.Builder(Stop1.this);
    b.setTitle("Пересадка");
    b.setPositiveButton("Отмена", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    b.setItems(city, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int position) {
            switch(position) {
                case 0:
                    startActivity(new Intent(Stop1.this, number_11.class));
                    break;
            }
        }
    });
    return b.create();
}

3 Избавляемся от вложенности:

private Dialog createKeyDialog() {
    AlertDialog.Builder b = new AlertDialog.Builder(Stop1.this);
    b.setTitle("Пересадка");
    b.setPositiveButton("Отмена", createPositiveListener());
    b.setItems(city, createItemsListener());
    return b.create();
}
private ... createPositiveListener() {
    return new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    }
}
private ... createItemsListener() {
    return new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int position) {
            switch(position) {
                case 0:
                    startActivity(new Intent(Stop1.this, number_11.class));
                    break;
            }
        }
    }
}

И так далее.

4 Избавляемся от магических констант: Здесь нужно как-то именовать такие константы, как: "Пересадка", "Отмена" - это позволит в дальнейшем их отредактировать в одном месте, а также при возможной локализации на другие языки.

5 Улучшаем читаемость имен: Бросается в глаза непонятное Stop1, также рекомендую привести к единому стилю (camelCase) имя: number_11

READ ALSO
Как можно при помощи Jsoup перемещаться по сайту не открывая новый Connection?

Как можно при помощи Jsoup перемещаться по сайту не открывая новый Connection?

У меня задача распарсить форум, я открываю соединение:

291
Как сделать карту оффлайн?

Как сделать карту оффлайн?

Есть приложение с googlemapApiВсе окей но хочу чтоб карта была оффлайн чтоб не подргружалась

216
JavaFx объясните причину появления рамок

JavaFx объясните причину появления рамок

Добрый деньВ прикрепленном рисунке слева скрин запущенного приложение в Intellij Idea, справа - предпросмотр в Scene Builder

300
Android / Java странный метод

Android / Java странный метод

Взял метод, который был у меня в прошлом проекте:

260