Выкарыстоўваючы два значэння для сазан адзін перамыкача

У маім кодзе, праграма робіць што-то ў залежнасці ад тэксту, уведзенага карыстальнікам. Мой код выглядае наступным чынам:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

Тым не менш, код ўнутры выпадках text1 і text4 тое ж самае. Таму мне было цікава, калі гэта было б магчыма для мяне ажыццявіць нешта накшталт

case text1||text4: {
            //blah
            break;
        }

Я ведаю, што || аператар не будзе працаваць у выпадку заявы, але ёсць нешта падобнае, я магу выкарыстоўваць.

174
@RichardTingle - вы знаёмыя з прыладай Дафі - en.wikipedia.org/wiki/Duff%27s_device </а>
дададзена аўтар user93353, крыніца
Будучы асноўнае пытанне, ці робіць што-небудзь больш eligable для upvotes, калі яго не дублікат, як яго паўсюднае выкарыстанне. І яго нешта, што не мне больш з'яўляцца, як гэта магчыма, але цяпер, калі я разумею, што яго стала відавочным. Так што ўсе ва ўсіх даволі страшэнны Q & A
дададзена аўтар Richard Tingle, крыніца
@ata гэта не пытанне ... Javascript
дададзена аўтар Kaiido, крыніца
@Luten: Я не мае значэння, калі гэта відавочна ці не. Пошук адказу было б хутчэй, чым пісаць пытанне.
дададзена аўтар Christian Strempfer, крыніца
«Чаму так шмат upvotes? Пошук" Java перамыкач "у Інтэрнэце і прачытаць адзін з тысячы тлумачэнняў.» <- Што ты думаеш, што я раблю?
дададзена аўтар Brendan, крыніца
@SrujanKumarGulla Вы не самотныя, ёсць, па меншай меры, 85 больш раўнівыя з іх;)
дададзена аўтар SantiBailors, крыніца
@Christian Strempfer, таму што паводзіны правальваецца з'яўляецца contrintuitive, лёгка не вядомы новымі распрацоўшчыкамі, а таксама некалькі значэнняў у адным выпадку будзе значна больш зручнымі для чытання.
дададзена аўтар Luten, крыніца
@Christian Strempfer, пошук і атрыманне гэтага адказу ў Q перапаўненне стэка ў & A фармаце замест чытання дакументацыі часта хутчэй. Я думаю, што гэтае пытанне эканоміць час (можа быць не для таго, хто напісаў гэта, але, безумоўна, для тых, хто знайшоў). Вось чаму ён атрымлівае upvotes.
дададзена аўтар Luten, крыніца
@Christian Strempfer, у свой час я не ведаў пра правальваешся, у той час як перамыкач рэгістр агульнай паводзіны відавочна - адсутнасць неабходных даследаванняў. Якія непрыемны сюрпрыз я адчуў, калі атрымаў памылку з-за правальваюцца. Я думаў, што ў гэты дзень «Якога чорта выпадак 9 працуе, калі значэнне 8, гэта ўзаемавыключальныя Калі ён сказаў выпадак 9 -. Ён не павінен быць выкананы, калі значэнне ня 9. Перыяд. Гэта закон логікі «. Як вы хацелі б , калі заяву працуе без адпаведных умоў. Акрамя таго, у некаторых мовах няма правальваецца, ці гэта не паводзіны па змаўчанні (лепшы спосабам імхо).
дададзена аўтар Luten, крыніца
Я літаральна шукаў «некалькі выпадкаў у адным радку Java», і гэта Q & А быў першым вынікам.
дададзена аўтар domenix, крыніца

8 адказы

Вы можаце выкарыстоўваць абодва CASE заявы наступным чынам.

  case text1: 
  case text4:{
            //blah
            break;
        }

Глядзіце ў гэтым прыкладзе: Прыклад кода вылічае колькасць дзён у пэўным месяцы:

class SwitchDemo {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

Гэта выхад з кода:

Number of Days = 29

ПРАВАЛЬВАЦЦА:

<�Р> Яшчэ адзін цікавы заяву перапынак. Кожны аператар перапынку   завяршае якое ахоплівае заяву перамыкача. Кіраванне патокам працягваецца   першая заява пасля блока перамыкачоў. выказванні перапынку   неабходныя, таму што без іх, сцвярджэння ў камутацыйных блоках падзенне   праз Усе заявы пасля ўзгаднення выпадку этыкетак выкананы ў   паслядоўнасць, незалежна ад выразы наступных этыкетак,   пакуль заяву перапынку не сустракаюцца.

Прыклад кода:

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList futureMonths =
            new java.util.ArrayList();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

Гэта выхад з кода:

August
September
October
November
December

Выкарыстанне радкоў у прыборныя справаздачнасці

<�Р> У Java SE 7, а затым, вы можаце выкарыстоўваць аб'ект String, ў камутатары   Выраз інструкцыі. Наступны прыклад кода ,   адлюстроўвае чысло месяца, на аснове значэння радкі   названы месяц:
public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

Выхад з гэтага кода 8.

З Java Docs

376
дададзена
@RichardTingle падзякаваць у так шмат сэра
дададзена аўтар PSR, крыніца
@RichardTingle я пазначана яго comment.The так КАМАНДА выдалены
дададзена аўтар PSR, крыніца
@ Kobor42 спачатку навучыцца гаварыць у грамадскім sites.Any, як ваша прапанова дапамагчы ful.Thanks
дададзена аўтар PSR, крыніца
@EmperorOrionii я абнавіў свой адказ, як вы suggested.Thanks
дададзена аўтар PSR, крыніца
ой добра. Гэта было лёгка. Не ведаю, што я мог бы зрабіць гэта
дададзена аўтар Ankush, крыніца
@PSR Магчыма, яны сапраўды сапраўды пагадзіліся з Kobor42. Па ўсёй справядлівасці я згодны з Kobor42 (не дастаткова, каб спыніць гэта істота дзіўнага адказу, хоць) і цяпер, калі яго адрэдагаваны дзіўны адказ +
дададзена аўтар Richard Tingle, крыніца
@ Kobor42 Як наконт: Чаму вы выкарыстоўвалі, што фарматаванне? Ўвод выпадкаў робіць гарызантальна код менш чытэльнымі і, як правіла, лічыцца дрэннай практыкай [Спасылка не абавязкова, але пажадана]. Я заўсёды адчуваў, што заявы камутатара з'яўляюцца асабліва чытаным фарматам, але прадстаўлены такім чынам, яны губляюць ўсё гэта.
дададзена аўтар Richard Tingle, крыніца
@ Kobor42 Часта дакладна, але для месяцаў 1 == 2 студзеня == Feburary досыць ўкараніліся, што толькі з дапамогай нумары выдатна
дададзена аўтар Richard Tingle, крыніца
@ Kobor42 Толькі так мы ясныя; Я згодны з вамі, маё фарматаванне ваша фарматаванне. Мой пункт гледжання была пра тое, як вы казалі, што гэта не тое, што вы казалі (хоць большасць заўваг, то, здаецца, былі выдаленыя)
дададзена аўтар Richard Tingle, крыніца
Я ведаю, як казаць на публічных сайтах. блог .stackoverflow.com/2012/08/& hellip;
дададзена аўтар Kobor42, крыніца
@RichardTingle Вы пытаецеся маю спасылку? Тут: google.com/search?q=switch+case+best+ практыка Я не магу бачыць ваша фарматаванне ў любым месцы ...
дададзена аўтар Kobor42, крыніца
Дазвольце мне дадаць яшчэ remarok на чытальнасці: На мой погляд, для выкарыстання лікаў разе не з'яўляецца добрым. Не тлумачачы сітуацыю, вы выбіраеце. Калі ласка, звярніце ўвагу на мой рэдагаваць і прымаць яго, калі вы згодныя.
дададзена аўтар Kobor42, крыніца
Варта адзначыць, што гэтая асаблівасць мовы называецца правальвацца. Выпадкі без разрыву у асноўным дадаецца наступны выпадак блока, які візуальна ніжэй, такім чынам, <�я> падаць </я> праз.
дададзена аўтар Emperor Orionii, крыніца

Вы можаце зрабіць так:

case text1:
case text4: {
            //blah
            break;
}
28
дададзена
для ОП: прачытайце гэта таксама выпадкі пераключэння Java: з або без дужак?
дададзена аўтар Grijesh Chauhan, крыніца

<�Код> выпадак значэнне толькі Codeless «GOTO» кропка, якія могуць падзяліць тую ж кропку ўваходу:

case text1:
case text4: 
    //blah
    break;

Звярніце ўвагу, што фігурныя дужкі з'яўляюцца залішнімі.

21
дададзена
@trig лол. Я раблю такія рэчы шмат у апошні час - вінаваціць iPhone пальца друкаваць. ура
дададзена аўтар Bohemian, крыніца
Гэта заўсёды добра, калі вашы пункту ўваходу ў разумным розуме.
дададзена аўтар TRiG, крыніца

навогул

case text1: case text4: 
     do stuff;
     break;
14
дададзена

<�Код> правальваецца Адказы на іншых з'яўляюцца добрымі.

Аднак іншы падыход быў бы метады здабываць са зместу вашых сцвярджэнняў справы, а затым проста выклікаць адпаведны метад ад кожнага канкрэтнага выпадку.

У прыведзеным ніжэй прыкладзе, як выпадак «text1» і справа «text4» паводзяць сябе гэтак жа:

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

Я асабіста лічу гэты стыль справы заявы лісты больш рамонтапрыдатнасць і трохі больш зручнымі для чытання, асабліва калі метады вы называеце добрыя імёны.

5
дададзена
Я скажу, што гэты метад, верагодна, павінен быць аб'яднаны з іншым спосабам у любым выпадку, бо заявы перамыкач няма (ІМХО) самая прыгожая структура праграмавання.
дададзена аўтар Nick Freeman, крыніца
Гэта не больш рамонтапрыдатнасць, калі text1 і text4 амаль напэўна будзе рабіць тое ж самае, незалежна ад будучых зменаў. Калі яны заўсёды павінны быць звязаныя паміж сабой, што робіць змяненне ў выпадку для TEXT1 (гэта значыць змена, які метад ён называе) запатрабуе змяненняў у text4 . У гэтым выпадку, відавочна, не больш рамонтапрыдатнасць. Гэта залежыць ад сітуацыі.
дададзена аўтар Nick Freeman, крыніца

Дужкі не патрэбныя. навогул

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

Калі камусьці цікава, то гэта называецца выпадак правальваецца. Магчымасць зрабіць гэта прычына, чаму пралом; неабходна скончыць заяву рэгістра. Для атрымання дадатковай інфармацыі гл вікіпедыі артыкула http://en.wikipedia.org/wiki/Switch_statement ,

4
дададзена

Падзенне праз падыход з'яўляецца найлепшым я адчуваю.

case text1:
case text4: {
        //Yada yada
        break;
} 
2
дададзена

Значэння выпадкаў проста Codeless «GOTO» кропка, якія могуць падзяліць тую ж кропку ўваходу:

case text1:
case text4: {
//Do something
break;
}

Звярніце ўвагу, што фігурныя дужкі з'яўляюцца залішнімі.

1
дададзена