在项目中有一种很常见的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.csdn.NET/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));
}
}