《mybatis 技术内幕之 2.2.4 Property工具集》:org.apache.ibatis.reflection.property

PropertyTokenizer

问题:怎么解析表达式:orders[0].items[0].name

这里写图片描述

public class PropertyTokenizer implements Iterable<PropertyTokenizer>, Iterator<PropertyTokenizer> {
  private String name;//当前表达式的名称
  private String indexedName; //当前表达式的索引序名称
  private String index;//索引下标
  private String children;//子表达式
 //向构造函数中传入要解析的字符串表达式,例如“orders[0].items[0].name”
  public PropertyTokenizer(String fullname) {
    int tempIndex= fullname.indexOf('.');  //第一个点“.”的索引下标
    if (tempIndex> -1) {
      name = fullname.substring(0, tempIndex);//初始化name
   ```
      //(***存在的问题:name指代不清楚***),本处指:orders[0]
   ```
      children = fullname.substring(tempIndex+ 1);//初始化children
    } else {
      name = fullname;  
      children = null;
    }
    indexedName = name;  //初始化 indexName
    tempIndex= name.indexOf('[');
    if (delim > -1) {
      index = name.substring(delim + 1, name.length() - 1);//初始化index
      name = name.substring(0, delim);
    }
  }
  //====上诉四个字段的get and  set 方法省略====//

  //会创建新的PropertyTokenizer对象并解析children字段子表达式
  public PropertyTokenizer next() {
    return new PropertyTokenizer(children);
  }
}

//我对代码的改进:代码中有些字段不清楚,也不好理解
/**
 * Created by xule on 2018/5/6.
 */
 //orders[0].items[0].name
public class MyPropertyTokenizer {
    private String nameAndIndex;  // orders[0]
    private String name;   //orders
    private String index;  //0
    private String children; //items[0].name
    public MyPropertyTokenizer(String fullname){
        int tempIndex=fullname.indexOf(".");
        if(tempIndex>-1){
            nameAndIndex=fullname.substring(0,tempIndex);
            children=fullname.substring(tempIndex+1);
        }else{
            nameAndIndex=fullname;
            children=null;
        }
        tempIndex=nameAndIndex.indexOf("[");
        if(tempIndex>-1){
            name=nameAndIndex.substring(0,tempIndex);
            index=nameAndIndex.substring(tempIndex+1,nameAndIndex.length()-1);
        }else{
            name=nameAndIndex;
            index=null;
        }
    }
    public static void main(String[] agrs){
        MyPropertyTokenizer myPropertyTokenizer = new MyPropertyTokenizer("orders[0].items[0].name");
        System.out.println("nameAndIndex:"+myPropertyTokenizer.nameAndIndex);
        System.out.println("name:"+myPropertyTokenizer.name);
        System.out.println("index:"+myPropertyTokenizer.index);
        System.out.println("children:"+myPropertyTokenizer.children);
    }
}

输出结果:

nameAndIndex:orders[0]
name:orders
index:0
children:items[0].name

代码优化:在语义上更容易理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值