码迷,mamicode.com
首页 > 其他好文 > 详细

隐式的前置依赖

时间:2019-12-23 22:08:59      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:程序   cat   logger   err   ogg   ror   tostring   fas   多态   

谜题

下面代码有问题吗 ?

Map<String, Object> extraMap;  // 声明

Boolean isItemIncluded = isItemIncludingTax(extraMap.toString());

private Boolean isItemIncludingTax(String extra) {
     JSONObject itemExtra = JSONObject.parseObject(extra);
     return itemExtra.containsKey("tax") && "1".equals(itemExtra.get("tax"));
}


写个简单的单测验证下:

public class MapStringParserTest {

  @Test
  public void testParse() {
    Map<String, Object> map = new HashMap<>();
    map.put("a", "{\"outer\":1}");
    System.out.println(map);

    JSONObject parsed = JSONObject.parseObject(map.toString());
    System.out.println(parsed.getString("a"));
  }
}

输出结果:

{a={"outer":1}}

com.alibaba.fastjson.JSONException: expect ':' at 0, actual =

    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:290)

抛异常了。

可是,奇怪的是程序运行正常 。? 为什么 ? 猜猜看。




谜底

因为有前置依赖。


    orderItemFormatBO.setExtraMap(getExtraMap(extra));

    protected Map getExtraMap(String extraJson){
        if(StringUtils.isNoneEmpty(extraJson)){
            try {
                return JSON.parseObject(extraJson);
            }catch (Exception e){
                logger.error("extra fomat not valid:{}", extraJson, e);
            }
        }
        return null;
    }

在设置的时候, extraMap 被设置为?JSONObject 对象, 而在调用 toString 的时候,根据多态,调用的是??JSONObject 的多态方法。 这才没出问题。?

   public String toString() {
      return this.toJSONString();
   }

好个超距呼应 !?一旦 extraMap 被重新设置为新的 非 JSONObject 的 Map,就一定会出问题。

别侥幸,虽然逃过一劫, 下次,还能幸运避免吗 ?

隐式的前置依赖

标签:程序   cat   logger   err   ogg   ror   tostring   fas   多态   

原文地址:https://www.cnblogs.com/lovesqcc/p/12088646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!