繁体   English   中英

Java 在 switch 语句中使用字符串

[英]Java Using strings from within a switch statement

我有以下代码

    switch (dayCurrent) {
        case 0: 
                String today_sun = "Today is Sunday";
                break;
        case 1: 
                String today_mon = "Today is Monday";
                break;
        case 2: 
                String today_tues = "Today is Tuesday";
                break;
        case 3: 
                String today_wed = "Today is Wednesday";
                break;
        case 4: 
                String today_thurs = "Today is Thursday";
                break;
        case 5: 
                String today_fri = "Today is Friday";
                break;
        case 6: 
                String today_sat = "Today is Saturday";
                break;
        // If statement for invalid entry
        default: if (dayCurrent >= 7) {
            System.out.println("Invalid day entered");
        }
    }
    // Switch statements to display future day
    if (dayCurrent < 7) {
        switch (dayFinal) {
            case 0: 
                    String future_sun = dayFuture + " day(s) later it is Sunday";
                    break;
            case 1: 
                    String future_mon = dayFuture + " day(s) later is Monday";
                    break;
            case 2: 
                    String future_tues = dayFuture + " day(s) later is Tuesday";
                    break;
            case 3: 
                    String future_wed = dayFuture + " day(s) later is Wednesday";
                    break;
            case 4: 
                    String future_thurs = dayFuture + " day(s) later is Thursday";
                    break;
            case 5: 
                    String future_fri = dayFuture + " day(s) later is Friday";
                    break;
            case 6: 
                    String future_sat = dayFuture + " day(s) later is Saturday";
                    break;

如果我想创建一个 System.out.println 显示两个开关的结果,我该怎么做? 我知道此代码之前出现在这里: Java (Find the future date with if else statements) ,并且执行 System.out.print 会更容易,但我很好奇如何执行上述操作以供将来参考。

级联

在将代码中的多个字符串拼凑在一起时,将它们连接起来。 在 Java 中有多种方法可以做到这一点。

+号组合了String对象。 每个String对象都是不可变的,这意味着您不会更改(“变异”)它的值。 相反,一个新的实例结合了原始值和新添加的 String 对象而诞生。

String message = "My name is ";
message = message + "Basil";
message = message + "."; 
System.out.println( message );  // My name is Basil.

另一种方法是对实现Appendable接口的任何类的对象调用append

StringBuilder是适合您情况的Appendable实现。

StringBuilder message = new StringBuilder( "My name is " );
message.append( "Basil" );
message.append( "." ); 
System.out.println( message.toString() );  // My name is Basil.

警告:仅在线程安全不成问题的情况下才使用StringBuilder 当您的Appendable对象可能被多个线程访问时,请改用StringBuffer

有关各种字符串相关对象的更多信息,请参阅对问题的回答,Java 中 CharSequence 和 String 之间的确切区别

DayOfWeek

DayOfWeek 枚举包含七个实例,一周中的每一天一个。 获取今天的星期几意味着获取今天的日期,这需要一个时区。 对于任何给定时刻,日期因地区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = DayOfWeek.from( today );  // `dow` is an *object*, not mere text like `Monday` or mere integer number like `1`.

使用此枚举的对象而不仅仅是整数来表示星期几,可以使您的代码更具自文档性,提供类型安全,并确保有效值。

switch 块定义文本对象

问题代码中的主要问题是保存字符串的变量是switch case定义的; 该变量在退出switch case时超出范围,并在您有机会连接或打印文本之前立即成为垃圾收集的候选对象(您的字符串对象消失并被销毁,从内存中清除,换句话说)内容。

所以这段代码:

switch (dayCurrent) {
    case 0: 
            String today_sun = "Today is Sunday";
            break;
    case 1: 
            String today_mon = "Today is Monday";
            break;
…

…本来应该:

String today = null;

switch (dayCurrent) {
    case 0: 
            today = "Today is Sunday";
            break;
    case 1: 
            today = "Today is Monday";
            break;
…

但是,更好的是,我们可以用AppendableStringBuilder替换该String对象。

StringBuilder

当连接多个字符串并且线程安全在您的上下文中不是问题时,请使用StringBuilder类。

请注意,我们在switch之外定义了这个名为message StringBuilder对象。 switch之外定义意味着对象在 switch 执行其工作之前、之中和之后仍然存在,存在。

StringBuilder message = new StringBuilder();

switch ( dow ) {
    case DayOfWeek.MONDAY:
    case DayOfWeek.TUESDAY: 
    case DayOfWeek.WEDNESDAY: 
    case DayOfWeek.THURSDAY:  
    case DayOfWeek.FRIDAY: 
        message.append( "Weekday - Working for a living. " );
        break;

    case DayOfWeek.SATURDAY:
    case DayOfWeek.SUNDAY: 
        message.append( "Wohoo! Weekend… Party on Garth! " );
        break;

    default: 
        System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for DayOfWeek 'dow'.");
    }

您的代码的dayFuture部分对我来说毫无意义,并且似乎与您跨多个switch块拼凑文本的问题无关。 所以我会用一个废话whatever开关。

switch ( whatever ) {
    case thisThing: 
        message.append( "Use vanilla." );
        break;

    case thatThing: 
        message.append( "Use chocolate." );
        break;

    case theOtherThing: 
        message.append( "Use almond." );
        break;

    default: 
        System.out.println("ERROR - Unexpectedly reached case DEFAULT on value for whatever.");
    }

现在我们已经建立了一个由多个组件组成的消息。 我们可以将其输出到System.out

System.out.println( message.toString() ); // Outputs day-of-week text combined with flavor text.

平日 - 工作谋生。 使用巧克力。

日期数学

至于将日期添加到另一个日期以获得另一个日期,只需调用plus…minus…方法。

如果用户输入数字字符串,则解析为要添加的天数的数字。

Integer days = Integer.valueOf( "4" );

加上那个天数。

LocalDate future = today.plusDays( days );

如果传递此经过的时间,请使用TemporalAmount例如PeriodDuration对象,而不仅仅是整数。

Period period = Period.ofDays( days );
LocalDate future = today.plus( period );

要查看未来日期的星期几,请获取DayOfWeek枚举对象。 不需要开关。

DayOfWeek dow = DayOfWeek.from( future );

您可以向DayOfWeek询问其本地化名称。 调用DayOfWeek::getDisplayName 通过TextStyle指定长度或缩写。 并通过Locale来指定用于翻译的人类语言以及用于决定诸如标点符号和部分排序等问题的文化规范。

String dowName = 
    dow.getDisplayName( 
        TextStyle.FULL_STANDALONE , 
        Locale.CANADA_FRENCH );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM