java 链式调用经典写法

public class Chain {

 private List<ChainHandler> handlers;

    private int index = 0;

    public Chain(List<ChainHandler> handlers) {
        this.handlers = handlers;
    }

    public void proceed(){
        if(index >= handlers.size()){
            return ;
        }
        handlers.get(index++).execute(this);
    }
}

-----------------------------------------

public abstract class ChainHandler {

    public void execute(Chain chain){
        handleProcess();
        chain.proceed();
    }

    protected abstract void handleProcess();
}

----------------------------------------------------

public class ChainClient {
    static class ChainHandlerA extends ChainHandler{
        @Override
        protected void handleProcess() {
            System.out.println("handle by chain a");
        }
    }
    static class ChainHandlerB extends ChainHandler{
        @Override
        protected void handleProcess() {
            System.out.println("handle by chain b");
        }
    }
    static class ChainHandlerC extends ChainHandler{
        @Override
        protected void handleProcess() {
            System.out.println("handle by chain c");
        }
    }

    public static void main(String[] args){
        List<ChainHandler> handlers = Arrays.asList(
                new ChainHandlerA(),
                new ChainHandlerB(),
                new ChainHandlerC()
        );
        Chain chain = new Chain(handlers);
        chain.proceed();
    }
}

<think>好的,用户让我介绍一下Java中的链式调用。首先,我需要确认自己对链式调用的理解是否正确。链式调用,也叫方法链,是一种编程风格,允许在单个语句中连续调用多个方法,每个方法返回一个对象,通常是当前对象或者另一个对象的引用,从而可以继续调用方法。这样代码看起来更连贯,可读性更高。 接下来,我得回忆一下Java中实现链式调用的常见方法。常见的有两种:一种是返回this,也就是当前对象的引用,适用于同一个类中的方法连续调用;另一种是构建器模式,比如在创建复杂对象时使用Builder类,每个方法设置一个属性后返回Builder实例,最后通过build方法生成目标对象。 然后,我需要考虑用户可能的背景。可能是Java初学者,想了解如何写出更简洁的代码,或者在使用某些库(比如Lombok)时遇到链式调用,想了解原理。也可能是有一定经验的开发者,想优化代码结构。所以,我需要解释清楚基本概念,同时举一些实际的例子,比如StringBuilder或者自定义类的例子,让用户更容易理解。 另外,用户可能想知道链式调用的优点和缺点。优点是代码简洁、可读性好,减少临时变量;缺点是调试可能困难,因为所有调用在一行,而且如果方法有副作用,可能会影响代码逻辑。还有,需要提到一些常见的使用场景,比如构建器模式、流畅接口设计,或者测试中的断言链式调用。 还要注意是否需要提到Lombok库的@Accessors(chain = true)注解,简化setter方法的链式调用,这样用户如果使用Lombok的话会更方便。不过可能用户还不了解Lombok,所以需要简单说明。 现在组织结构:先定义链式调用,然后实现方式分两种,分别举例说明,再讲优缺点,应用场景,最后总结。确保用中文,例子用Java代码,用$$包裹代码块,行内公式用$,比如方法返回this,可能需要提到返回类型为当前类。 检查是否有遗漏点,比如链式调用与方法链的区别,或者可能的设计模式关联,比如流畅接口。确保例子正确,比如在构建器模式中是否正确返回this,最后build()方法返回目标对象。 可能需要对比传统写法,展示链式调用的简洁性。例如,传统需要多行setter,而链式调用可以一行完成。这有助于用户理解优势。 最后,确认是否需要用更口语化的中文,避免过于技术化的术语,但保持准确性。比如“每次方法调用后返回对象本身”而不是“返回当前实例的引用”。 总结思考过程,确保覆盖所有关键点,结构清晰,用户容易理解。</think>在 Java 开发中,**链式调用**是一种通过连续调用对象方法的编程风格(也称为**方法链**),其特点是每个方法都会返回对象本身,使得代码可以像链条一样连贯书写。 ### 📌 实现方式 #### 1. 返回 this 的常规写法 ```java public class Student { private String name; private int age; public Student setName(String name) { this.name = name; return this; // 关键点:返回当前对象 } public Student setAge(int age) { this.age = age; return this; // 关键点:返回当前对象 } } // 调用示例 Student stu = new Student() .setName("小明") .setAge(18); // 链式连续调用 ``` #### 2. 构建器模式(Builder Pattern) ```java public class Pizza { private String size; private boolean cheese; // 构建器类 public static class Builder { private String size; private boolean cheese = false; public Builder size(String size) { this.size = size; return this; } public Builder cheese(boolean cheese) { this.cheese = cheese; return this; } public Pizza build() { Pizza pizza = new Pizza(); pizza.size = this.size; pizza.cheese = this.cheese; return pizza; } } } // 调用示例 Pizza pizza = new Pizza.Builder() .size("Large") .cheese(true) .build(); // 最终构造对象 ``` ### ⚡ 核心特点 - **连贯性**:方法调用形成自然语言式表达(如 `obj.methodA().methodB()`) - **减少冗余**:避免重复书写对象变量名 - **代码简洁**:原本多行的赋值操作可合并为单行 ### ✅ 适用场景 1. **对象初始化**(如 `StringBuilder` 的 `append()` 链式操作) 2. **单元测试断言**(如 AssertJ 的 `assertThat(obj).isNotNull().hasSize(5)`) 3. **流式 API 设计**(如 Java Stream 的 `list.stream().filter(...).map(...).collect(...)`) ### 🔧 实现技巧 若使用 Lombok 库,可通过注解自动生成链式调用代码: ```java import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) // 自动生成返回 this 的 setter public class User { private String id; private String name; } // 自动生成的 setter 等效于: public User setId(String id) { this.id = id; return this; } ``` ### 🌟 优势 vs 局限 | 优势 | 局限 | |------|------| | 提升代码可读性 | 调试时难以单步跟踪 | | 减少临时变量 | 异常堆栈信息指向同一行 | | 支持流畅接口设计 | 需谨慎处理有副作用的方法 | 链式调用通过**方法返回对象自身**的特性,让代码展现出更优雅的形态,是 Java 实现流畅接口(Fluent Interface)的核心手段之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

softwareDragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值