美文网首页Android知识Java学习笔记
项目实战:关于format(String)你不知道的那些事

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

作者: Mr_Quan | 来源:发表于2017-03-20 21:30 被阅读113次

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/jeginttx.html