教你正确的Java扩展方法示例详解

目录
  • 引言
  • 支持扩展方法的语言
    • C#
    • Visual Basic
    • Kotlin
  • 主角登场
    • Lombok @ExtensionMethod
    • Manifold
  • 总结

引言

扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显的差异。

支持扩展方法的语言

其实比较多的编程语言都支持了扩展方法,如C#、Visual Basic、Kotlin等,但我们的Java语言就是迟迟不支持,在JDK9中开始支持以jmod方式扩展java功能,JDK16承诺给出动态库调用方案,但是作为JDK8的钉子户的我们如果也想使用扩展方法,就得另寻他路了。

C#

/// 扩展方法
public static class ExpandMethod {
    /// 两个数相加
    public static int Sum(this int num,int num2) {
        return num + num2;
    }
}
public class Program {
    static void Main(string[] args) {
        /// 调用位置
        Console.WriteLine(3.Sum(2));
    }
}

Visual Basic

Imports System.Runtime.CompilerServices
Module Module3
    Sub Main()
        Dim ex As New ExampleClass
        ' 调用位置
        ex.ExampleMethod("Extension method")
    End Sub
    Class ExampleClass
        ' Define an instance method named ExampleMethod.
        Public Sub ExampleMethod()
            Console.WriteLine("Instance method")
        End Sub
    End Class
    <Extension()>
    Sub ExampleMethod(ByVal ec As ExampleClass,
            ByVal stringParameter As String)
        Console.WriteLine(stringParameter)
    End Sub
End Module

Kotlin

// 扩展函数(本类中扩展方法)
class Test1 {
    var name: String = "boyi.chen"
}
fun Test1.temp() {
    println("增加扩展函数,打印扩展类的属性name=${this.name}")
}
fun main(args: Array<String>) {
    // 调用位置
    Test1().temp()
}

主角登场

Java8本身不支持扩展方法,但我们可以通过插件的方式实现扩展方法,用起来跟直接使用扩展方法一样一样的,Lombok就是其中的一款插件。

Lombok @ExtensionMethod

通过Lombok @ExtensionMethod注解,程序编译期间帮我们生成直接调用的静态方法,当然IDEA插件能提供更好的支持,下边看下具体的例子。

/**
 * lombok测试
 *
 * @author reboot
 */
@ExtensionMethod(StringUtil.class)
public class LombokTest {
    public static void main(String[] args) {
        System.out.println("".isBlank());
    }
    /**
     * 字符串工具
     *
     * @author reboot
     */
    public static class StringUtil {
        /**
         * 字符串判空
         *
         * @param targetStr 目标str
         * @return boolean
         */
        public static boolean isBlank(String targetStr) {
            return targetStr == null || "".equals(targetStr);
        }
    }
}

编译后的内容可以看到方法已经从 "".isBlank() 转换为 LombokTest.StringUtil.isBlank(""),Lombok也正是通过这种方式提供给我们扩展方法的语法糖,真的好甜。

Manifold

这里就不具体介绍了,感兴趣的朋友可以看这篇文章 Java 缺失的特性:扩展方法 作者写的还是比较全面的。

总结

扩展方法能够使我们的代码看起来更加简洁,但是对于曾经未接触过的同学,可能第一次碰到会比较懵,所以要适当使用哦,上边提到了两种扩展方法的实现方式,如果项目中本来就引入了Lombok建议直接使用@ExtensionMethod比较好,不要再引入其他插件,这样会增加项目接手和熟悉的成本,今天就讲到这里,希望对阅读本文章的你有所帮助。

以上就是教你正确的Java扩展方法示例详解的详细内容,更多关于Java扩展方法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 论java如何通过反射获得方法真实参数名及扩展研究

    前言 前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题.通过解决这个问题,附带着我了解到了很多新的知识,我觉得有必要和大家分享交流一下. 示例 咱们先来看这样一个小的demo: 这是一个很简单的小demo,里面就是一个简简单单的类Test1,Test1有一个包含两个参数的方法test,在Test1的main方法中通过射来获得test方法的所有参数的名字,并将其输出到标准流.我本以为这个demo的运行结

  • Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件之后文件是空的或者数据不全 在编程的过程中,读写文件是非常常见的操作,在这里我问介绍一下最近我遇到的集中写文件写不进去的情况.首先给出完整的代码. import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class Main { public static void main(String[] args) throws IOEx

  • Java插件扩展机制之SPI案例讲解

    目录 什么是SPI 与 接口类-实现类 提供的RPC 方式有什么区别? 假设我们需要实现RPC,是怎么做的? 那RPC究竟跟SPI什么关系? SPI的应用场景 怎么实现一个SPI? 中间件是怎么实现SPI的? Apollo-Client中的实现 JDBC中的实现 什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.其为框架提供了一个对外可扩展的能力. 与 接口类-实现类 提供的RPC 方式有什么区别? 传统的接口类实现形式为如下 public

  • 详解Java 缺失的特性扩展方法

    目录 什么是扩展方法 传统写法: 使用 Stream 写法: 在 Java 中怎么实现扩展方法 准备条件 编写扩展方法 数组扩展方法 扩展静态方法 建议 什么是扩展方法 扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改现有类型.调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异. 为什么需要扩展方法 考虑要实现这样的功能:从 Redis 取出包含多个商品ID的字符串后(每个商品ID使用英文逗号分隔),先对商品ID进行去重(并能够维持元

  • Java9中对集合类扩展的of方法解析

    目录 Java9 集合类扩展of方法 Java9集合类中重载多个of方法原因 有如下描述 Java9 集合类扩展of方法 package com.jd.collections; import org.junit.Test; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.IntStream; import ja

  • Java8 Collectors求和功能的自定义扩展操作

    业务中需要将一组数据分类后收集总和,原本可以使用Collectors.summingInt(),但是我们的数据源是BigDecimal类型的,而Java8原生只提供了summingInt.summingLong.summingDouble三种基础类型的方法. 于是就自己动手丰衣足食吧.. 自定义工具类 public class MyCollectors { private MyCollectors() { } // public static <T> Collector<T, ?, Bi

  • 在java中使用SPI创建可扩展的应用程序操作

    简介 什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能.我们将应用程序做成插件或者模块. 这样可以在不修改原应用的基础上,对系统功能进行升级或者定制化. 本文将会向大家介绍如何通过java中的SPI机制实现这种可扩展的应用程序. SPI简介 SPI的全称是Java Service Provider Interface.是java提供的一种服务发现的机制. 通过遵循相应的规则编写应用程序之后,就可以使用ServiceLoader来加载相应的服务了. SPI的实现

  • 教你正确的Java扩展方法示例详解

    目录 引言 支持扩展方法的语言 C# Visual Basic Kotlin 主角登场 Lombok @ExtensionMethod Manifold 总结 引言 扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显的差异. 支持扩展方法的语言 其实比较多的编程语言都支持了

  • JAVA构造函数(方法)示例详解

    目录  一.什么是构造函数 二.构造函数的特点 三.示例 四.默认构造函数 五.构造函数的重载 六.构造函数的使用 构造函数的特点 总结  一.什么是构造函数 Java构造函数,也叫构造方法,是JAVA中一种特殊的函数.与函数名相同,无返回值. 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象的属性和方法. 在现实生活中,很多事物一出现,就天生具有某些属性和行为.比如人一出生,就有年龄.身高.体重.就会哭:汽车一出产,就有颜色.有外观.可以运行等. 这些,我们就可以将这

  • jQuery.extend()、jQuery.fn.extend()扩展方法示例详解

    jQuery自定义了jQuery.extend()和jQuery.fn.extend()方法.其中jQuery.extend()方法能够创建全局函数或者选择器,而jQuery.fn.extend()方法能够创建jQuery对象方法. 例如: 复制代码 代码如下: jQuery.extend({ showName : function(name){ alert(name) } }); jQuery.showName("深蓝"); jQuery.extend()除了可以创建插件外,还可以用

  • Python正确重载运算符的方法示例详解

    前言 说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~).说得宽泛一些,在 Python 中,函数调用(()).属性访问(.)和元素访问 / 切片([])也是运算符. 我们为 Vector 类简略实现了几个运算符.__add__ 和 __mul__ 方法是为了展示如何使用特殊方法重载运算符,不过有些小问题被我们忽视了.此外,我们定义的Vector2d.__eq__ 方法认为 Vector(3, 4) == [3, 4]

  • 浅谈使用Java Web获取客户端真实IP的方法示例详解

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: 方式一.客户端未经过代理,直接访问服务器端(nginx,squid,haproxy): 方式二.客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy): 客户端请求信息都包含在HttpServletRequest中,可以通过方法getRemoteAddr()获得该客户端IP.

  • Go Java算法之外观数列实现方法示例详解

    目录 外观数列 方法一:遍历生成(Java) 方法二:递归(Go) 外观数列 给定一个正整数 n ,输出外观数列的第 n 项. 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述. 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) = "1" countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串. 前五项如下: 1.1 —— 第一项是数字 1 2.11 —— 描述前一项,这个数

  • Go Java算法之解码方法示例详解

    目录 解码方法 方法一:动态规划(Java) 方法二:动态规划——优化(go) 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> "1" 'B' -> "2" ... 'Z' -> "26" 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法).例如,"11106" 可以映射为: "AAJF" ,将消息分组为 (1 1 1

  • Java binarysearch方法原理详解

    这篇文章主要介绍了Java binarysearch方法原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先 数组排序需要import java.util.Arrays类 binarysearch有两个用法,一个是在整个数组里搜索,一个是在指定范围搜索,其实都是差不多的,可以将前者视为后者的特殊情况. 用法1 binarySearch(Object[], Object key) Object是目标数组,key是目标值,要求目标数组必须要

  • .NET 中配置从xml转向json方法示例详解

    目录 一.配置概述 二.配置初识 三.选项模式 四.选项依赖注入 五.其它配置 六.托管模式 一.配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式. 在xml里面有系统生成的配置项,也有我们自己添加的一些配置,最常用的就是appSettings节点,用来配置数据库连接和参数. 使用的话就引用包System.Configuration.Configur

  • VSCode各语言运行环境配置方法示例详解

    系统环境变量的配置 如:将F:\mingw64\bin添加到系统环境变量Path中 VSCode软件语言json配置C语言 创建个.vscode文件夹,文件夹内创建以下两个文件 launch.json 文件配置 { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg&

随机推荐