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

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

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

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

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

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

相关·内容

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

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

44410

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

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

66920

读spring @Async源码让我收获了什么

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

49450

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

2、Fragment生命周期 Fragment比Activity多了几个生命周期方法 onAttach(): 当该Fragment被添加到Activity时被,该方法只会被调用一次。...onCreateView(): 每次创建、绘制该FragmentView组件时该方法,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 库生成目标对象子类 。

56820

系统学习SpringFramework:SpringBean生命周期

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

26110

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

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

44020

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

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

14210

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

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

90360

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

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

1.1K20

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

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

2.1K100

SpringBoot集成JWT实现token验证

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

98820

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

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

2.9K10

Spring 面试题,打包给大家

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

29620

夯实Java基础系列11:深入理解Java机制

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

37700

Spring 全家桶之 Spring Boot 2.6.4(九)- 启动流程解析

方法,也就是准备环境 该方法先是创建一个environment,创建环境之后listeners,表示环境准备完成 第299行是打印banner也就是启动应用时控制台出现Spring图标,这个图标是可以自定义...这里做了判断,然后对容器进行了set操作;来到第406行 这里获取主程序,然后判断是否为空 preparedContext方法最后一步,所有的listenercontextLoad方法...和CommandRunner两个类型Bean 再往下,就是进行,最后返回IoC容器。...contextPrepared 记载配置定义信息 监听器SpringApplicationRunListenercontextLoaded 刷新启动IoC容器 扫描加载所有容器组件 包括从META-INF...HalloSpringApplicationRunListener增加一个参构造器,可以参考SpringApplicationRunListener一个实现EventPublishingRunListener

70021

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

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

48140

夯实Java基础系列11:深入理解Java机制

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

53140

夯实Java基础系列9:深入理解Class和Object

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

38730
领券