Groovy重载操作符(终极版)

时间:2022-07-24
本文章向大家介绍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
    }
}