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

创建一个接口类的实例而不是仅仅将该接口添加到主类中进行回调有什么好处?

创建一个接口类的实例而不是仅仅将该接口添加到主类中进行回调有以下好处:

  1. 解耦性:通过创建接口类的实例,可以将接口的实现与主类完全分离,减少了主类与具体实现的耦合度。这样,在需要修改接口实现时,只需要修改接口类的实现,而不需要修改主类的代码。
  2. 可扩展性:通过创建接口类的实例,可以方便地扩展接口的实现。可以根据需要,创建不同的接口实现类,并将其实例化并传递给主类,从而实现不同的功能。
  3. 可复用性:通过创建接口类的实例,可以将接口的实现在不同的类中复用。多个类可以共享同一个接口实例,从而实现相同的功能,提高代码的复用性。
  4. 可测试性:通过创建接口类的实例,可以方便地进行单元测试。可以使用模拟对象或者桩对象来替代接口的实现,从而实现对主类的独立测试。
  5. 可替换性:通过创建接口类的实例,可以方便地替换接口的实现。可以根据需要,替换接口实现类的实例,从而实现不同的功能或者性能优化。

总之,创建一个接口类的实例而不是仅仅将该接口添加到主类中进行回调可以提高代码的灵活性、可扩展性、可维护性和可测试性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET简谈组件程序设计之(异步委托)

在任何组件客户代码中都能对其进行调用,而不是传递方法对象的引用,这样能大大的降低代码的耦合。事件就是运用委托的优势进行对象的消息传递。。[王清培版权所有,转载请给出署名] 那么什么是异步委托呢?...Add添加到委托列表中,然后使用同步调用,也就是直接用委托实例调用。...所以我们定于的委托并不是简简单单的方法的一个包装,里面有复杂的实现逻辑,能很好的支持异步调用,当然异步调用是由基类帮我们实现的,它帮我们申请.NET后台线程池中的线程来进行方法的调用,能让工作线程继续处理重要的事情...其实还有一个比较重要的东西就是BeginInvoke方法中的最后一个参数,其实该参数是用来传递回调方法的参数的,由于回调方法的签名是不能变的,只能是用IAsyncResult接口作为参数,所以我们只能通过...由于事件是基于委托的所以我们当然可以通过事件进行异步的调用订阅者的方法,但是不能像往常那样直接进行BeginInvoke,只有当委托列表中仅仅有一个委托方法时才能直接BeginInvoke,如果多余一个必须进行循环调用

48010

带你跳出源码地狱,从原理上理解MyBatis对Spring源码的扩展实现

这个类并不会像其它普通的bean那样在Spring容器初始化的时候就进行实例化,而是会类似于懒加载的一种机制,再获取的时候才会进行创建和返回!...它除了有扫描指定包下的类的功能,还有解析@Import注解的功能,ImportBeanDefinitionRegistrar就是@Import中一个比较特殊的类,它会被Spring自动的回调内部的registerBeanDefinitions...如果只是能够进行回调的话,BeanDefinitionRegistryPostProcessor也能完成类似的功能,它的特殊之处在于什么呢?我们看一下它的方法签名!...创建过程中,通过之前传入的接口,做jdk动态代理,完成MyBatis的代理逻辑! 对象创建完成后,通过isSingleton方法的返回值判断,如果是单例对象,就将该对象缓存起来!并返回!...image-20200915220432302 它添加到了一个集合里面!至此,我们至少知道了,这里会向集合里面添加一个过滤器,至于有什么用,我们后面会说到,你这里先记住!

69720
  • 读spring @Async的源码让我收获了什么?

    通常我们可以通过:线程、线程池、定时任务 和 回调等方法来实现异步,其中用得最多的可能是线程和线程池。...此外,使用线程池,我们也需要一个类去实现Runnable或Callable接口,然后将该类的实例提交到线程池中,如果该类实现的是Runnable接口,则在run方法中执行我们自己的业务逻辑,并且没有返回值...知识点:看到这里明白了为什么上一步@EnableAsync注解Import的AsyncConfigurationSelector类,而不是直接引入配置类,因为根据不同的adviceMode通知模式引入不同的配置类...后面两种都可以根据不同的条件返回不同的配置类,有什么区别呢?...先将@Async和javax.ejb.Asynchronous类添加到set集合中,然后使用buildAdvice方法创建通知,使用buildPointcut方法创建切入点。 ?

    52250

    Android高频面试专题 - 基础篇(二)Fragment

    2、Fragment生命周期 Fragment比Activity多了几个生命周期的回调方法 onAttach(): 当该Fragment被添加到Activity时被回调,该方法只会被调用一次。...onCreateView(): 每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件。...onDetach(): 将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法,该方法只会被调用一次。...() 向Activity中添加一个Fragment transaction.remove() 从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说...,或者横竖屏切换时,解决办法是只有在savedInstanceState==null时,才进行创建Fragment实例,通过检查onCreate的参数Bundle savedInstanceState就可以判断

    1.4K10

    JAVA关于Spring 面试题汇总

    在 Spring 中,有几种依赖注入方式? 依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。...同样的,当一个 bean 不在被调用时需要进行相关的析构操作,并从 bean 容器中移除 。 Spring bean factory 负责管理在 spring 容器中被创建的 bean 的生命周期 。...Bean 的生命周期由两组回调(call back)方法组成 。 初始化之后调用的回调方法。 销毁之前调用的回调方法。...它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API。 它支持声明式事务管理 。 它和 Spring 各种数据访问抽象层很好的集成 。...优点:因为有接口,所以使系统更加松耦合 缺点:为每一个目标类创建接口 2、若目标对象没有实现任何接口, spring 则使用 CGLIB 库生成目标对象的子类 。

    58420

    长达100分钟的阿里二三面,惊险刺激!乔戈里又和学弟要来了面经!

    我说没处理…正常应该是类似于 Mysql 一样有个主备切换的机制。 SpringBoot中的 AOP 分为几类, AOP 主要是两种方式,一种是直接通过 JDK 动态代理,一种是通过cglib。...动态代理再熟悉不过了,是只能代理接口,cglib现在我们来具体看一下。 我们知道,动态代理是代理类实现被代理类的接口,而cglib则是代理类继承被代理类,也就是子类增强父类的手段。...()); //设置回调接口,这里的MethodInterceptor实现类回调接口,而我们又实现了MethodInterceptor,其实 //这里的回调接口就是本类对象...return enhancer.create(); } //回调接口的方法 //回调接口的方法执行的条件是:代理对象执行目标方法时会调用回调接口的方法 @Override...有什么好处?什么是mysql注入?$ 和 # 有什么区别 JPA是orm框架标准,主流的orm框架都实现了这个标准。 MyBatis没有实现JPA,他和orm框架的设计思路完全不一样。

    44820

    系统学习SpringFramework:SpringBean的生命周期

    并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在 BeanWrapper 对象中,BeanWrapper 提供了设置对象属性的接口,从而避免了使用反射机制设置属性。...容器通过获取 BeanDefinition 对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。...说白了,他会在扫描完项目将 Class 转换 为 BeanDefinition 之后在进行实例化之前进行接口的回调!...2、BeanPostProcessor 这个类和上面那个类十分的相似,他有两个方法,两个方法的调用时机也不相同,他会在实例化之后,调用初始化方法之前进行第一次方法回调(postProcessBeforeInitialization...),在执行完初始化方法之后又会进行一次回调(postProcessAfterInitialization),每次回调该类都会将当前创建好的 Bean 传递到方法内部,从而让开发者能够自定义的修改当前 Bean

    28610

    【项目设计】仿muduo实现高性能服务器组件

    而Any的单参构造函数则需要是一个模板函数,我们需要根据其所传参数推导出其类型,并将该类型作为参数传递给模板类placeholder,通过这样的方式就可以设计出一个保存任意类型数据的Any容器出来。...RunLoop接口中,epoll_wait会将就绪的事件设置回Channel中,此时RunLoop就会调用Channel的HandleReadyEvent接口进行就绪事件的处理,而Channel中各个事件的回调函数实际上是由...想要实现定时任务队列,需要两个类,一个是Timer类,也就是构建出一个定时任务来,然后通过TimerWheel对外提供的添加定时器的接口,来将对应的定时任务添加到定时任务队列(数组)中。...实际上这个baseloop是TcpServer创建的,因为主Reactor和从Reactor线程最终都一样,他们最终其实都是死循环运行EventLoop模块的RunLoop接口,只不过主Reactor监控的其实是监听套接字上的可读事件什么时候能够就绪...,再去进行连接实际的释放,这就是为什么这四个回调函数中调用的都是向外public提供的Release接口,而不是内部实际的ReleasePriv接口。

    22210

    Enterprise Library 4 缓存应用程序块的设计

    CacheManagerFactory 类创建所有实现 CacheManager 所需要的内部类。 每个名称只能用于一个缓存,要创建多个缓存的实例,就得使用多个名称。...在它被调用后,BackgroundScheduler 将请求打包成一条消息,并将它放到一个队列集合对象中,而不是马上执行所请求的行为。(记住,这都发生在调用者的线程中。)...对于清理过程,它调用 StartScavengingMsg 类的 Run 方法。在一个单一线程中顺序执行操作的好处是保证代码运行在单一线程的环境中,这使代码和它的影响更容易理解。...回调 可选择的是,开发人员可以使用 Add 方法的一个重载来指定应用程序在条目过期并从缓存中移除后接收一个回调。如果需要,应用程序将刷新缓存。...然而,如果应用程序在第一个过期周期发生前请求一个过期的条目,缓存将执行回调,并返回 null 给应用程序。这确保每个过期条目回调的发生,并防止应用程序接收到一个过期的条目。

    93860

    Carson带你学Android:网络请求库Retrofit源码分析

    源码分析 Retrofit实例是使用建造者模式通过Builder类进行创建的 建造者模式:将一个复杂对象的构建与表示分离,使得用户在不知道对象的创建细节情况下就可以直接创建复杂的对象。...:数据转换器工厂的集合 callbackExecutor:回调方法执行器 所谓xxxFactory、“xxx工厂”其实是设计模式中工厂模式的体现:将“类实例化的操作”与“使用对象的操作”分开,使得使用者不用知道具体参数就可以实例化出所需要的...以Method为键将该对象存入LinkedHashMap集合中 // 特别注意:如果不是提前验证则进行动态解析对应方法(下面会详细说明),得到一个ServiceMethod对象,最后存入到LinkedHashMap...生成实例过程中含有生成实现类的缓存机制(单例模式),下面会详细分析 使用动态代理的好处: 当NetService对象调用getCall()接口中方法时会进行拦截,调用都会集中转发到 InvocationHandler...:采用单例模式从而实现一个 ServiceMethod 对象对应于网络请求接口里的一个方法 // 注:由于每次获取接口实例都是传入 class 对象 // 而 class 对象在进程内单例的,所以获取到它的同一个方法

    1.2K20

    Spring 面试题,打包给大家

    依赖被注入到对象,而不是创建或寻找依赖对象。 面向切面编程(AOP):Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。...——初始化回调和销毁回调方法 实现 Bean 初始化回调和销毁回调各有三种方法,一是实现接口方法,二是在XML配置,三是使用注解 使用注解 @PostConstruct 和 @PreDestroy 实现...InitializingBean 和 DisposableBean 接口 XML 中配置 init-method 和 destroy-method 在一个 bean 中,如果配置了多种生命周期回调机制...切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件 引入(Introduction...如果当前没有事务正在发生,将抛出一个异常 PROPAGATION_NESTED 表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。

    32320

    SpringBoot集成JWT实现token验证

    JWT请求流程 用户使用账号和面发出post请求; 服务器使用私钥创建一个jwt; 服务器返回这个jwt给浏览器; 浏览器将该jwt串在请求头中像服务器发送请求; 服务器验证该jwt; 返回响应的资源给浏览器...HandlerInterceptor接口 HandlerInterceptor接口主要定义了三个方法 1.boolean preHandle (): 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器...用于进行资源清理。 整个请求处理完毕回调方法。...,标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内。...需要一个实现HandlerInterceptor接口的拦截器实例,addPathPatterns方法用于设置拦截器的过滤路径规则。

    1K20

    实战SpringBoot集成JWT实现token验证【附源码】

    用户使用账号和面发出post请求; 服务器使用私钥创建一个jwt; 服务器返回这个jwt给浏览器; 浏览器将该jwt串在请求头中像服务器发送请求; 服务器验证该jwt; 返回响应的资源给浏览器。...HandlerInterceptor接口 HandlerInterceptor接口主要定义了三个方法 1.boolean preHandle (): 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器...用于进行资源清理。 整个请求处理完毕回调方法。...,标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内。...需要一个实现HandlerInterceptor接口的拦截器实例,addPathPatterns方法用于设置拦截器的过滤路径规则。

    3.2K10

    一个创建自定义事件源的例子

    每个线程都有一个单独的 RunLoop 对象与之相关联。在Cocoa,这个对象是 NSRunLoop 类的一个实例。在底层应用中,它是一个指向 CFRunLoopRef 不透明类型的指针。...当有 UIGestureRecognizer 的变化(创建/销毁/状态改变)时,这个回调都会进行相应处理。...而初始化方法中包含了Run Loop Source Context的三个回调方法,具体代码如下: - (instancetype)init { self = [super init];...Source添加到Run Loop中时,会回调这个方法。...,这个事件会根据你数据的准备情况来主动唤醒子线程的RunLoop来处理具体事件,这样的好处不言而喻,充分利用了RunLoop的特性,非常适合类似网络请求这样的异步等待事件。

    2.2K100

    夯实Java基础系列11:深入理解Java中的回调机制

    (3)回调 1、什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用、异步调用和回调。...实例二:由浅入深 前几天公司面试有问道java回调的问题,因为这方面也没有太多研究,所以回答的含糊不清,这回特意来补习一下。...//那么学生如何调用到老师的方法呢,只要在学生类的方法中传入老师的引用即可。 //而老师需要指定学生答题,所以也要传入学生的实例。...,可以做别的事,比如玩手机.\ //而不需要同步等待,这就是回调的好处。...//学生的接口,解决问题的方法中要传入老师的引用,否则无法完成对具体实例的回调。

    39900

    夯实Java基础系列11:深入理解Java中的回调机制

    (3)回调 1、什么是回调?一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用、异步调用和回调。...实例二:由浅入深 前几天公司面试有问道java回调的问题,因为这方面也没有太多研究,所以回答的含糊不清,这回特意来补习一下。...//回调接口, public interface CallBack { void tellAnswer(int res); } 数学老师类 //老师类实例化回调接口,即学生写完题目之后通过老师的提供的方法进行回调...//那么学生如何调用到老师的方法呢,只要在学生类的方法中传入老师的引用即可。 //而老师需要指定学生答题,所以也要传入学生的实例。...//学生的接口,解决问题的方法中要传入老师的引用,否则无法完成对具体实例的回调。

    57440

    【面试】必问的 Spring IOC,要看看了!!!

    好,解释了低级容器和高级容器,我们可以看看一个 IoC 启动过程是什么样子的。说白了,就是 ClassPathXmlApplicationContext 这个类,在启动时,都做了啥。...加载成功后,高级容器启动高级功能,例如接口回调,监听器,自动实例化单例,发布事件等等功能。 所以,一定要把 “低级容器” 和“高级容器” 的区别弄清楚。不能一叶障目不见泰山。...为什么不是在加载的时候,就直接注入呢?因为加载的顺序不同,很可能 Bean_A 依赖的 Bean_B 还没有加载好,也就无法从容器中获取,你不能要求用户把 Bean 的加载顺序排列好,这是不人道的。...然后,在调用 getBean 的时候,进行真正的依赖注入,即如果碰到了属性是 ref 的(占位符),那么就从容器里获取这个 Bean,然后注入到实例中 —— 称之为依赖注入。...一句话,他不仅仅是 IoC。他支持不同信息源头,支持 BeanFactory 工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等等。

    50540
    领券