项目实战:关于format(String)你不知道的那些事

本文通过实例探讨了在Java中如何优雅地进行字符串拼接,特别是针对动态与静态字符串组合的场景。通过对比直接拼接与使用String.format()方法的区别,深入分析了format()方法在处理空值和空字符串时的行为,并提供了源码级别的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中有一种很常见的case就是字符串拼接,以我们专车下单页的企业规则校验场景为例,如图,


我们来分析这一句提示文案:

立即叫车服务不符合企业用车规则,无法用车

它是由两部分组成,动态的当前服务类型(立即叫车)+静态的固定文案(服务不符合企业用车规则,无法用车)。

因为我们现在有很多服务类型(立即叫车、预约用车、日租、半日租、接机、送机、定制···),我们需要根据用户选择的服务类型动态改变提示文案中的服务类型,因此它是动态的,所以这就涉及到了字符串拼接。

String serviceType,当前服务类型,

String rule_content = "服务不符合企业用车规则,无法用车",固定文案。

最简单的字符串拼接做法,就是serviceType+rule_content。

然而,亲,这样效率低啊~

虽然对目前市场上的手机CPU而言这点效率不算啥。

但本着“代码可以更优雅”的原则,追求更流畅的用户体验。


我们使用了format:

String.format(rule_content, serviceType)

rule_content = "%s服务不符合企业用车规则,无法用车"


然而事情没有我们想的这么简单,输出结果可以是这样:

服务不符合企业用车规则,无法用车

还可以是这样:

null服务不符合企业用车规则,无法用车


对于:服务不符合企业用车规则,无法用车

我可以强行String serviceType = "";

比较好理解~


对于:null服务不符合企业用车规则,无法用车

我可以强行String serviceType = null;

嗯哼,为啥不是捕获异常啥的,

打破砂锅问到底,让我们追一下源码吧。

从String.format(rule_content, serviceType)开始,

进入:

    public static String format(String format, Object... args) {
        return new Formatter().format(format, args).toString();
    }

然后:

    public Formatter format(String format, Object ... args) {
        return format(l, format, args);
    }

终于:

public Formatter format(Locale l, String format, Object ... args) {
···
                case 0:  // ordinary index
                    lasto++;
                    last = lasto;
                    if (args != null && lasto > args.length - 1)
                        throw new MissingFormatArgumentException(fs.toString());
                    fs.print((args == null ? null : args[lasto]), l);
                    break;
···

我们去FormatString的print方法里看看,

            case Conversion.STRING:
                printString(arg, l);
                break;

对于String:

        private void printString(Object arg, Locale l) throws IOException {
            if (arg instanceof Formattable) {
                Formatter fmt = Formatter.this;
                if (fmt.locale() != l)
                    fmt = new Formatter(fmt.out(), l);
                ((Formattable)arg).formatTo(fmt, f.valueOf(), width, precision);
            } else {
                if (f.contains(Flags.ALTERNATE))
                    failMismatch(Flags.ALTERNATE, 's');
                if (arg == null)
                    print("null");

                else
                    print(arg.toString());
            }
        }

如果String为null,那么我们输出“null”,Get~


复盘一下,因为用户在我们APP上选择不同的服务类型,然后传参,肯定有值,作用域内,生命周期内,强引用。

因此在这种场景下serviceType不会“”也不会null。


但万一这个值由MAPI返回,丢了呢,或者从其他地方获取,可能没值,

作用域外?生命周期外?弱引用?等等各种case。

如果他为“”或者null,考虑程序的健壮性和用户体验,我们是不是应该做一下处理呢?


关于format(String)你不知道的那些事~


原创不易,转载请注明出处哈。
权兴权意
代码可以更优雅~
http://blog.youkuaiyun.com/hxqneuq2012/article/details/62418414


测试源代码:

package string;

/**
 * @author Mr.Quan
 * 2017-3-16
 */

public class FormatTest {
	
	private static final String rule_content = "%s服务不符合企业用车规则,无法用车";

	public static void main(String[] args) {
		String serviceType1 = "";
		System.out.println(String.format(rule_content, serviceType1));
		String serviceType2 = null;
		System.out.println(String.format(rule_content, serviceType2));
		String serviceType3 = "立即叫车";
		System.out.println(String.format(rule_content, serviceType3));
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值