Проблемы с оператором switch - PullRequest
0 голосов
/ 26 апреля 2018

Я недавно написал некоторый Java-код с повторяющимися порциями (избыточность), как это

    switch (listRoutes.get(i)) {
            case "A":
                if (route.equals("A")) {
                    System.out.println("Red icon displayed.");
                    Marker mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
                            .title("Arrival Time of Shuttle: " + Coordinates[0])
                            .icon(BitmapDescriptorFactory.fromResource(android.R.drawable.btn_star_big_off)));

                    System.out.println("mCurrent location"+ mCurrent.toString());

                    if (!start_location.equals(end_location)) {
                        animateMarker(end_location, mCurrent);
                    }

                }
                break;
            case "C":
                if (route.equals("C")) {
                    System.out.println("Yellow icon displayed");
                    mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
                            .title("Arrival Time of Shuttle: " + Coordinates[0])
                            .icon(BitmapDescriptorFactory.fromResource(R.mipmap.commercial_bus)));
                    //animateCarMove(mCurrent,start_location,end_location,3000,"C");
                    if (!start_location.equals(end_location))
                        animateMarker(end_location, mCurrent);

                }
                break;
            case "B":
                if (route.equals("B")) {
                    System.out.println("Blue icon displayed");
                    mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
                            .title("Arrival Time of Shuttle: " + Coordinates[0])
                            .icon(BitmapDescriptorFactory.fromResource(R.mipmap.brunei_bus)));


                    if (!start_location.equals(end_location))
                        animateMarker(end_location, mCurrent);
                    //animateCarMove(mCurrent, start_location, end_location, 3000, "B");
                }
                break;
            default:
                if (route.equals("C")) {
                    System.out.println("Default Icon displayed");
                    mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
                            .title("Arrival Time of Shuttle: " + Coordinates[0])
                            .icon(BitmapDescriptorFactory.fromResource(R.mipmap.commercial_bus)));
                    if (!start_location.equals(end_location))
                        animateMarker(end_location, mCurrent);
                    //animateCarMove(mCurrent,start_location,end_location,3000,"C");
                }
                break;
        }

Случилось так, что случай «А» никогда не возникал, хотя System.out.println работал.

Я рефакторинг это так:

int iconResource = R.mipmap.bus_gaza;
    switch (listRoutes.get(i)) {
            case "A":
                if (route.equals("A")) {
                    iconResource = R.mipmap.bus_gaza;
                }
                break;
            case "B":
                if (route.equals("B")) {
                    iconResource = R.mipmap.brunei_bus;
                }
                break;
            case "C":
            default:
                if (route.equals("C")) {
                    iconResource = R.mipmap.commercial_bus;
                }
                break;
        }
        mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
                .title("Arrival Time of Shuttle: " + Coordinates[0])
                .icon(BitmapDescriptorFactory.fromResource(iconResource)));

        if (!start_location.equals(end_location))
            animateMarker(end_location, mCurrent);

Это работает. Я подозреваю, что это больше от оператора switch, чем от чего-либо еще. Кто-то может подтвердить или опровергнуть это для меня?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Только что заметил, что вы используете другое значение для "A" в 2 примерах. Я считаю, что первое должно быть:

BitmapDescriptorFactory.fromResource(R.mipmap.bus_gaza)

а не android.R.drawable.btn_star_big_off

0 голосов
/ 26 апреля 2018

Разбейте свою проблему на более мелкие кусочки. Ваш первый выбор довольно сложен для чтения.

1) Вам нужно что-то сделать для listRoutes(i). Ввод, который вы хотите рассмотреть, является "A", "B" и "C".

ПРИМЕЧАНИЕ. Ваша исходная программа имела избыточную переменную route, определенную где-то еще за пределами блока кода, который вы показали. Упрощение кода путем разбиения его на небольшие методы, которые выполняют только одно, поможет вам избежать подобных проблем.

2) Эти буквы соответствуют вашим mipmap ресурсам (bus_gaza, brunei_bus и commercial_bus).

3) Затем вы хотите поместить где-нибудь маркер, основываясь на значении в (1).

Создайте несколько методов для обработки всего этого, например:

public int toResourceId(String route) {
    int resourceId;
    switch (route) {
        case "A":
            resourceId = R.mipmap.bus_gaza;
            break;
        case "B":
            resourceId = R.mipmap.brunei_bus;
            break;
        case "C":
        default:
            resourceId = R.mipmap.commercial_bus;
    }
    return resourceId;
}

, а затем сделать что-то с resourceId, где start_location предполагается переменной класса, поскольку ее нет нигде в вашем коде (подумайте, как назвать ее mStartLocation)

public void mark(int resourceId) {
    mCurrent = mMap.addMarker(new MarkerOptions().position(start_location)
            .title("Arrival Time of Shuttle: " + Coordinates[0])
            .icon(BitmapDescriptorFactory.fromResource(resourceId)));
}

Если вы хотите зарегистрировать начальное и конечное местоположение или информацию о текущем местоположении, как вы упомянули в своем примере, почему бы не использовать Android Log? Вы можете добавить логику в метод mark:

Log.i("YOUR_TAG", "Whatever you want to log");

Тогда большая часть вашей программы становится

mark(toResourceId(listRoutes.get(i)))

Обратите внимание, что в этом примере регистр "C" также является регистром по умолчанию, и любое значение, отличное от "A" или "B", будет обрабатываться как "C".

0 голосов
/ 26 апреля 2018

Обычно это происходит, если route и listRoutes.get(i) не имеют одинаковых значений.

Хорошим вариантом будет, если route не является строкой: route.equals() будет сравнивать объект с "A", что приведет к ошибке, но оператор println вызовет route.toString() для быть призванным.

...