zoukankan      html  css  js  c++  java
  • Groovy重载操作符(终极版)

    最近在研究JSonpath在接口验证和接口串联之间的应用,目前进度尚可,已经在语法封装上有了一个思路。借助Groovy重载操作符的特性,适配一部分类似于=>>=classType这样的验证功能,重新翻起来了《Groovy in action》这本神书,重新复习了一下,再看看自己之前写过的Groovy重载操作符,有点对不住读者。

    特意将官方API里面所有的操作符重载都实现了一遍,对于一些疑问做了一些注释,这里有两个操作符未能实现:-+,这并不是,而是表示正负值的,Groovy里面是可以直接对对象使用这两个操作符来完成数值的正负转换,对于List对象同样适用。但是这两个操作符只能对数值型数值型List使用,目前尚未解决这个操作符的其他类型使用的方案。

    • 这里需要注意++--操作符,Groovy没有区分前后,而且根据实现逻辑会最终赋值给当前对象,所以需要一个返回值,不然很容易报空指针异常,当然也可以通过?.安全引用来避免,这个有空再讲了。文档中:Groovy还可以重写.这个操作符,有兴趣的同学可以一起研究。

    Demo代码

    package com.fun.utils
    
    import com.fun.frame.SourceCode
    
    /**
     * 操作符重写类,用于匹配JSonpath验证语法
     */
    class Verify extends SourceCode implements Comparable {
    
    
        def plus(int i) {
            logger.info("操作符: + {}", i)
        }
    
        def minus(int i) {
            logger.info("操作符: - {}", i)
        }
    
        def multiply(int i) {
            logger.info("操作符: * {}", i)
        }
    
        def div(int i) {
            logger.info("操作符: / {}", i)
        }
    
        def mod(int i) {
            logger.info("操作符: % {}", i)
        }
        /**
         * 必需有返回值
         * <p>
         *     defv=a;a=a.next();v a = a.next(); a
         * </p>
         *
         * @return
         */
        def next() {
            logger.info("操作符: i++ 或者 ++i")
            this
        }
        /**
         * 必需有返回值
         * <p>
         *     defv=a;a= a.previous(); v
         * </p>
         *
         * @return
         */
        def previous() {
            logger.info("操作符: i-- 或者 --i")
            this
        }
    
        def power(Verify verify) {
            logger.info("操作符: ** ${verify}")
    
        }
    
        def or(Verify verify) {
            logger.info("操作符: | ${verify}")
        }
    
        def and(Verify verify) {
            logger.info("操作符: & ${verify}")
        }
    
        def xor(Verify verify) {
            logger.info("操作符: ^ ${verify}")
        }
    
        def bitwiseNegate() {
            logger.info("操作符: ~i")
        }
    
        def getAt(int a = 3) {
            logger.info("操作符: i[${a}]")
        }
    
        def putAt(int a = 3, int c = 3) {
            logger.info("操作符: i[${a}]=${c}")
    
        }
    
        def leftShift(Verify verify) {
            logger.info("操作符: <<  ${verify}")
        }
    
        def rightShift(Verify verify) {
            logger.info("操作符: >>  ${verify}")
        }
    
        def rightShiftUnsigned(Verify verify) {
            logger.info("操作符: >>>  ${verify}")
        }
    
        def isCase(Verify verify) {
            logger.info("操作符: case  ${verify}")
            true
        }
        /**
         * if (a implements Comparable) { a.compareTo(b) == 0 } else { a.equals(b) }* @param a
         * @return
         */
        def equals(Verify verify) {
            logger.info("操作符: ==  ${verify}")
            //todo:重写
            true
        }
    
    /**
     * a <=> b  a.compareTo(b)
     * a>b      a.compareTo(b) > 0
     * a>=b     a.compareTo(b) >= 0
     * a<b      a.compareTo(b) < 0
     * a<=b     a.compareTo(b) <= 0
    
     * @param o
     * @return
     */
        @Override
        int compareTo(Object o) {
            logger.info("操作符: <=> >= > < 等等")
            //todo:重写
            return 0
        }
    
        def <T> T asType(Class<T> tClass) {
            logger.info(tClass.toString())
            if (tClass.equals(Integer)) 4
        }
    }
    
    

    • 公众号FunTester首发,更多原创文章:440+原创文章,欢迎关注、交流,禁止第三方擅自转载。

    热文精选

  • 相关阅读:
    FZU 2098 刻苦的小芳(卡特兰数,动态规划)
    卡特兰数总结
    FZU 1064 教授的测试(卡特兰数,递归)
    HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)
    Java 第十一届 蓝桥杯 省模拟赛 正整数的摆动序列
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
    Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
  • 原文地址:https://www.cnblogs.com/FunTester/p/13539422.html
Copyright © 2011-2022 走看看