首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 中安全使用接口引用

在Android 开发中我们经常会持有接口引用,或者注册事件的监听,诸如系统服务的通知,点击事件的回调等,虽不胜枚举,但大部分监听都需要我们去实现一个接口,因此我们今天就拿注册一个回调监听举例:...说实话,我需要的无非就是当接口引用为空的时候,不进行任何的函数调用,然而我们却需要在每一行代码之上强行添加丑陋的非空判断,这让我的代码看起来失去了信任,变得极其不可靠,而且繁琐的非空判断让我感到十分疲惫...面向接口的编程方式,使我们有天然的优势可以利用,动态代理正是基于接口,因此我们可以对接口引用添加动态代理并返回代理后的值,这样callback 引用实际指向了动态代理对象,在代理的内部我们借助反射调用callback...通过观察字节码的规则,了解到调用Java 接口中声明的方法使用的是invokeinterface 指令,因此我们只需要找到函数体中invokeinterface 指令所在的位置,在前面添加对接口引用的动态代理并返回代理结果的相关字节码操作...为了安全使用定义接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋中尽情遨游。

1.8K20

Java 中安全使用接口引用

在Android 开发中我们经常会持有接口引用,或注册某个事件的监听,如系统服务的通知,点击事件的回调等,虽不胜枚举,但大部分监听都需要我们去实现一个接口,因此我们就拿注册回调监听来举例: private...= null) { callback.onXXXX(); } 这看起来并没有什么问题,因为我们平时就是这样书写代码的,所以我们的项目中存在大量的对接口引用的非空判断,即使有参数型注解@NonNull...说实话,我需要的无非就是当接口引用为空的时候,不进行任何的函数调用,然而我们却需要在每一行代码之上强行添加丑陋的非空判断,这让我的代码看起来失去了信任,变得极其不可靠,而且频繁的非空判断让我感到十分疲惫...InterfaceBuoy 类则用于创建接口引用的动态代理对象。...为了安全使用定义接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋中尽情遨游。 ~~原文完~~

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java接口定义与实现

    1、定义接口 使用interface来定义一个接口接口定义同类的定义类似,也是分为接口的声明和接口体,当中接口体由常量定义和方法定义两部分组成。...接口名:必选參数,用于指定接口的名称,接口名必须是合法的Java标识符。普通情况下,要求首字母大写。 extends 父接口名列表:可选參数,用于指定要定义接口继承于哪个父接口。...r);//定义一个用于计算周长的方法getCircumference() } 注意: 与Java的类文件一样,接口文件的文件名称必须与接口名同样。...实现接口 接口定义后,就能够在类中实现该接口。...类名:必选參数,用于指定类的名称,类名必须是合法的Java标识符。普通情况下,要求首字母大写。 extends 父类名:可选參数,用于指定要定义的类继承于哪个父类。

    57810

    java8定义函数式接口

    前言在Java 8中,Lambda表达式可以用来代替只有一个抽象方法的接口,这种接口称为函数式接口。...接口默认方法和抽象方法在Java 8中接口支持默认方法的实现,使得接口的修改更加灵活,而不会破坏现有的实现。...Java 8中的接口默认方法和抽象类的方法有以下区别: 多继承: 接口可以实现多继承,一个类可以实现多个接口,包括具有默认方法的接口。而Java中的类只能单继承一个类,但可以实现多个接口。...构造函数: 接口不能有构造函数,而抽象类可以有构造函数。抽象类可以定义构造函数来初始化状态,而接口中的默认方法无法访问实例字段,因此无法初始化状态。...总结总的来说,函数式接口使得某些代码变得可读性更高,另外可以自定义组合,实现一个公共的组合方法实现对应的业务操作。

    27500

    教你在Java接口定义方法

    教你在Java接口定义方法 基本上所有的Java教程都会告诉我们Java接口的方法都是public、abstract类型的,没有方法体的。 但是在JDK8里面,你是可以突破这个界限的哦。...假设我们现在有一个接口:TimeClient,其代码结构如下: import java.time.*; public interface TimeClient { void setTime(int...,具体代码如下: package defaultmethods; import java.time.*; import java.lang.*; import java.util.*; public...那么,对于TimeClient接口定义的getZonedDateTime方法,你可以做如下三种处理: 重新声明getZonedDateTime方法,使它变成abstract类型。...重新定义getZonedDateTime方法。 直接继承。 而static方法和我们在类里面定义的static方法概念一致。

    81580

    读书笔记 | 《Effective Java》 | 接口定义

    接口和抽象类 1. 接口优于抽象类 Java 有两种机制来定义允许多个实现的类型:接口和抽象类。...由于在 Java 8 中引入了接口的默认方法(default methods ),因此这两种机制都允许为某些实例方法提供实现。 一个主要的区别是要实现由抽象类定义的类型,类必须是抽象类的子类。...因为 Java 只允许单一继承,所以对抽象类的这种限制严格限制了它们作为类型定义的使用。 任何定义所有必需方法并服从通用约定的类都可以实现一个接口,而不管类在类层次结构中的位置。...接口仅用来定义类型 当类实现接口时,该接口作为一种类型(type),可以用来引用类的实例。因此,一个类实现了一个接口,因此表明客户端可以如何处理类的实例。为其他目的定义接口是不合适的。...小结 不要试图通过接口定义常量,这会导致实现细节泄露到导出的 API 包中。

    25330

    java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type used...Java语言规范定义的函数式接口的注解类型....java.util.function.Function 函数 有输入有输出 数据转换功能 接口定义了一个叫作apply的方法,它接受一个泛型T的对象,并返回一个泛型R...方法引用 方法引用让你可以重复使用现有的方法定义  并像Lambda一样传递它们 方法引用使用  :: 来表示 方法引用主要有三类 (1) 指向静态方法的方法引用(例如Integer的parseInt...方法体由函数式接口的实例传递(也就是Lambda表达式-匿名函数   方法引用 构造方法引用 ) 具体的调用则是调用抽象方法  抽象方法的方法体就是函数式接口的实例 比如: 定义一个函数式接口

    1.8K30

    接口定义

    1、什么是接口 接口一般来讲分为两种 程序内部的接口:方法与方法、模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就会抛出一个接口...统称为 api,程序与程序之间的对接、交接;接口测试是测试系统组件间接口的一种测试;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点;接口测试主要是为了检验不同组件(模块)之间数据的一个传递是否正确...,同时接口测试还要测试当前系统与第三方系统的一个测试如:支付宝、财付通、微信、银联 5、为什么做接口测试 当界面功能没出来时,测试人员可以做接口测试,一是节省时间,二是测试一些界面功能测不到的场景 系统之间是通过接口相互传输数据...,如果接口都阻塞,系统间的接口调用和对业务的处理肯定会受到很大的影响 6、如何做接口测试 项目前后端调用主要是基于 http 协议的接口,所以测试接口时主要通过工具或代码模拟 http 请求发送与接收...7、接口测试保证接口联调 在公司中前端开发和后端开发是独立进行的,一个项目是由前端和后端组成,最终要进行前后端接口联调,来确保后端的数据能正常的展示在前端的页面,所以我们需要对接口进行测试,以确保接口可以正常的传输数据

    45240

    Java引用类型:强引用,软引用,弱引用,虚引用

    Java中提供了4个级别的引用:强引用,软引用,弱引用,虚引用。在这4个引用级别中,只有强引用FinalReference类是包内可见,其他3中引用类型均为public,可以在应用程序中直接使用。...强引用 Java中的引用,有点像C++的指针,通过引用,可以对堆中的对象进行操作。...这时候显式置null的作用不大,只要在我们的方法退出,即该栈桢从Java虚拟机栈弹出时,o指向Object的引用就断开了,此时Object在堆上分配的内存在GC时就能被回收。...可以通过java.lang.ref.SoftReference使用软引用,一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收,当堆使用率临近阈值时,才会去回收软引用对象...在java doc中,软引用是这样描述的 虚拟机在抛出 OutOfMemoryError 之前会保证所有的软引用对象已被清除。

    2.2K31

    Java中抽象类和接口定义

    参考链接: Java中的抽象 /**  *   * @author zhaocx1  *   */ /*  * 当多个类中出现相同功能,但是功能主提体不同。 这时可以进行向上抽取。...* 当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。  * 接口:interface  *   * class用于定义类,interface用于定义接口。  ...* 接口定义时,格式特点:  * 1.接口中常见定义:常量,抽象方法。  * 2.接口中的成员都有固定修饰符。  ...*需要被子类实现的,子类对接口中的方法都覆盖后,子类才可以实例化。  *否则子类是一个抽象类。  *  *接口可以被类多实现。也是对多继承不支持的转换形式。Java支持多实现。  ...    public abstract void show();//定义接口中的方法,方法是抽象的,格式是 public abstract } interface InterA//定义一个接口 {

    53720

    Java 的强引用、弱引用、软引用、虚引用

    如下: Object o=new Object(); // 强引用        当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题...int i = 0; i < size; i++) elementData[i] = null; size = 0; }        在ArrayList类中定义了一个私有的变量...软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。...,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。...5、总结     Java4种引用的级别由高到低依次为: 强引用  >  软引用  >  弱引用  >  虚引用     通过图来看一下他们之间在垃圾回收时的区别: ?

    3.6K30

    【小家java引用类型(强引用、软引用、弱引用、虚引用

    1、概述 本文不论述java中值传递和引用传递之间的问题(有需求的可移步理解java中值传递和引用传递),而重点讨论Java中提供了4个级别的引用:强应用、软引用、弱引用和虚引用。...这四个引用定义java.lang.ref的包下。...super T> q) { super(referent, q); } } 从类定义中可以看出,只有一个构造函数。...一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用 先看一个最简单的使用...里(更详细的可咨询JVM的对象回收流程),so public static void main(String[] args) { //定义一个引用队列 ReferenceQueue<Obj

    2.1K40

    Java学习笔记之Lamdba表达式 接口 方法引用

    0x00 概述 本文涉及Java知识点有Lambda表达式,接口的组成,接口中的默认方法,接口中的静态方法,接口中的私有方法,方法引用 0x01 Lambda表达式 1.1 Lambda表达式介绍 需求...    接口中有且仅有一个抽象方法 练习描述     无参无返回值抽象方法练习 操作步骤     定义一个接口(Eatable),里面定一个抽象方法:void eat();     定义一个测试类(EatableDemo...对应的字节码会在运行的时候动态生成 0x02 接口组成 2.1 接口组成更新概述 常量     public static final 抽象方法     public abstract 默认方法(Java...8) 静态方法(Java 8) 私有方法(Java 9) 2.2 接口中的默认方法 格式     public default 返回值类型 方法名(参数列表) { } 范例 public default...不能省略 2.4 接口中的私有方法 私有方法产生原因     Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:     Java 8允许在接口定义带方法体的 默认方法和静态方法

    31220

    Hive 变量定义引用

    通过定义变量并在查询中引用变量,可以使查询语句更加简洁和易读。 提高可维护性:通过定义变量,可以将常量和固定值抽象出来,使得查询语句更加易于维护和修改。...如果需要修改常量或固定值,只需要修改变量的值即可,而不需要修改所有引用该常量或固定值的查询语句。 提高可重用性:通过定义变量,可以将常量和固定值封装为一个可重用的模块。...总之,自定义变量和引用变量是一种良好的编程习惯,可以使查询语句更加简洁、易读、易于维护和重用,并提高查询语句的灵活性和可配置性。...命名空间 权限 描述 hiveconf 读写 Hive 相关配置属性 system 读写 Java 定义的配置属性 env 只读 Shell 环境定义的环境变量 hivevar 读写 用户自定义临时变量...Hive 中的自定义变量是会话级别的,即它们在会话结束后会被重置。 -- 必须加上 hivevar SET hivevar:myvar='hello'; 引用变量 (1)SQL 中引用定义变量。

    43700

    Java 的强引用、弱引用、软引用、虚引用

    Java四种引用包括强引用,软引用,弱引用,虚引用。...弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。...2 如果使用软引用 SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。...也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。...3 使用ReferenceQueue清除失去了软引用对象的SoftReference 作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。

    1.6K10
    领券