• 优雅的Java编程:将接口对象作为方法参数



    theme: smartblue

    目录

    image.png

    概述

    Java编程中,方法的参数传递方式通常是通过基本类型、对象引用或者集合等方式。然而,一种更加优雅且灵活的设计模式是将接口对象作为方法的参数。这种方式为我们带来了许多好处,包括降低耦合性、实现多态性和可替换性、实现依赖倒置原则等。本文将深入探讨这种设计模式的优势以及在实际开发中的使用场景。

    1. 降低耦合性

    将接口对象作为方法参数可以有效地降低方法的耦合性。通过接口,方法不再依赖于具体的实现类,而是依赖于接口。这使得方法更加通用,能够接受实现了相同接口的不同类的实例,从而提高了代码的灵活性。

    public void performAction(MyInterface myInterface) {
    // 执行操作
    myInterface.myMethod();
    }
    
    • 1
    • 2
    • 3
    • 4

    2. 实现多态性和可替换性

    接口作为方法参数的设计实现了多态性和可替换性。方法可以接受实现了同一接口的不同类的实例,从而实现了代码的灵活性和可扩展性。这也是面向对象设计中常见的设计原则之一。

    MyInterface myInstance = new MyImplementation();
    performAction(myInstance);
    
    • 1
    • 2

    3. 实现依赖倒置原则

    将接口对象作为方法参数有助于实现依赖倒置原则(Dependency Inversion Principle,DIP)。高层模块不依赖于底层模块的具体实现,而是依赖于抽象。通过接口作为参数,使得方法更加稳定,更容易进行单元测试和模块替换。

    interface MyInterface {
        void myMethod();
    }
    
    public class MyImplementation implements MyInterface {
        @Override
        public void myMethod() {
            // 具体实现
            System.out.println("MyImplementation.myMethod() called");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4. 实现回调机制

    接口对象作为方法参数的一种常见应用是实现回调机制。方法可以接受实现了某个回调接口的对象,并在适当的时机调用该接口的方法,从而实现一种异步通知或处理机制。

    public void doAsyncOperation(AsyncCallback callback) {
    // 异步操作完成后调用回调接口
    callback.onComplete(result);
    }
    
    • 1
    • 2
    • 3
    • 4

    5.举例

    在Javajava.util.concurrent包的CompletableFuture类中形如supplyAsync等方法中,外对提供了传入线程池对象的方法:

    public CompletableFuture thenRunAsync(Runnable action,
                                                Executor executor) {
        return uniRunStage(screenExecutor(executor), action);
    }
    
    public static  CompletableFuture supplyAsync(Supplier supplier,
                                                   Executor executor) {
    return asyncSupplyStage(screenExecutor(executor), supplier);
    }
    
    
    public CompletableFuture thenAcceptAsync(Consumer action,
                                                   Executor executor) {
        return uniAcceptStage(screenExecutor(executor), action);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    CompletableFuture中的这种写法就是为了使用者传入任何实现自Executor接口不同类型的线程池,如Java提供的ForkJoinPool、Spring Framework的线程池ThreadPoolTaskExecutor、阿里巴巴开源线程池ThreadPoolExecutor等。

    结语

    将接口对象作为方法参数是一种强大的设计模式,它提高了代码的可维护性、可扩展性和可读性。通过实现多态性、降低耦合性、遵循依赖倒置原则等,我们能够写出更加优雅、灵活的Java代码。在实际项目中,考虑到代码的可维护性和扩展性,合理地使用这种设计模式能够为项目带来不小的好处。

  • 相关阅读:
    Linux中搭建DNS 域名解析服务器(详细版)
    Leetcode hot 100
    如何使用HTML制作个人网站( web期末大作业)
    uniapp如何实现路由守卫、路由拦截,权限引导
    在ESP32-Arduino开发中添加其它Arduino库
    Spring Data JPA 、JdbcTemplate和原始 JDBC
    Vue3对话框样式修改不了
    过控Matlab-串级控制系统的参数整定(二)
    安全狗受邀出席CIS 2022网络安全创新大会
    【前端】从 0 到 1 实现一个网站框架(一、注册 [1] )
  • 原文地址:https://blog.csdn.net/weixin_42313773/article/details/134371006