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+原创文章,欢迎关注、交流,禁止第三方擅自转载。

    热文精选

  • 相关阅读:
    python 希尔排序
    python 选择排序
    python 插入排序
    怎么根据返回数量,来渲染点赞星星的个数变高量?
    avalon $computed不起作用?
    移动端点击事件兼容问题,在pc端可以点,在手机上不可以点
    移动端弹出遮罩层禁止页面滚动,遮罩里面的框允许滚动如何实现。
    移动端,如何禁止弹窗下面内容滚动/页面滚动
    avalon数据已更新,视图未更新的bug修复
    Python 导入分部分项前的 数据处理
  • 原文地址:https://www.cnblogs.com/FunTester/p/13539422.html
Copyright © 2011-2022 走看看