首页 > 其他分享 >面试官:如何实现链式调用?

面试官:如何实现链式调用?

时间:2023-12-14 11:59:22浏览次数:41  
标签:面试官 调用 name 代码 Student 链式 age

从 Java 8 开始,便引入了一种称为“流式 API”的编程风格,当然也被称为“链式设置”或“链式调用”。它主要是通过设置方法的返回值,让返回值变为对象自身,从而实现连续的方法调用,这种风格就叫做“链式设置”或“链式调用”。

例如,以下代码:

MySQLConnectOptions connectOptions = new MySQLConnectOptions()
    .setPort(3306)
    .setHost("127.0.0.1")
    .setDatabase("mydb")
    .setUser("root")
    .setPassword("root");

其属性的设置就称为链式调用或链式设置。

1.链式调用优点

使用链式调用主要有以下几个优点:

  1. 简洁性:链式设置使得代码更加简洁和易读。通过连续的方法调用,可以在一行代码中完成多个操作,减少了代码的冗余和嵌套。
  2. 可读性:链式设置可以提供更清晰、更自然的代码流。每个方法调用都可以形成一个语义上的整体,使得代码更易于理解。
  3. 可组合性:链式设置可以方便地组合多个操作。每个方法返回的是对象自身或包含对象自身的容器,使得可以连续地进行多个操作,从而实现更复杂的功能。
  4. 可扩展性:链式设置使得添加、修改或移除操作更加灵活。由于每个方法都是在对象自身上操作,并返回对象自身或包含对象自身的容器,可以轻松地添加新的操作或修改现有的操作。

总的来说,链式设置提高了代码的可读性和可组合性,使得代码更加简洁、灵活和易于维护。

2.链式调用实现

链式调用的主要实现方式,总共有以下 4 种:

  1. Setter 原生方式
  2. Lombok @Accessors 注解方式
  3. Lombok @Builder 注解方式
  4. Hutool GenericBuilder 方式

具体实现如下。

2.1 Setter 原生方式

Setter 原生方式的实现比较简单,只需要设置 Setter 方法,并且每个 Setter 方法都返回自身对象即可,如下代码所示:

public class Student {
    private String name;
    private int age;

    public Student name(String name) {
        this.name = name;
        return this;
    }

    public Student age(int age) {
        this.age = age;
        return this;
    }
}

链式调用代码如下:

Student stu = new Student()
        .name("磊哥")
        .age(18);

2.2 Lombok @Accessors 注解方式

Lombok 是一个 Java 库,它通过注解来简化 Java 代码的编写。其中,@Accessors 注解可以开启链式调用风格。

具体实现代码如下:

@Getter
@Setter
@Accessors(chain = true)
public class Student {
    private String name;
    private int age;
}

在上面的示例中,使用了 @Accessors(chain = true) 注解来开启链式调用风格。这样就可以通过以下方式进行链式设置:

Student stu = new Student()
	.setName("John")
	.setAge(30);

2.3 Lombok @Builder 注解方式

使用 @Builder 注解,会自动生成一个 Builder 类,通过该 Builder 类可以链式地设置类的属性并创建对象。这种方式在构建复杂对象时非常方便。

具体实现代码如下:

import lombok.Builder;

@Builder
public class Student {
    private String name;
    private int age;
}

链式调用代码如下:

Student stu = Student.builder()
    .name("磊哥")
    .age(18)
    .build();

2.4 Hutool GenericBuilder 方式

Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。其中,Hutool 提供了 GenericBuilder 类,可以实现链式调用,具体实现代码如下:

Student stu = GenericBuilder.of(Student::new)
                .with(Student::setName, "磊哥")
                .with(Student::setAge, 18)
                .build();

小结

使用链式调用(也叫做链式设置)提高了代码的可读性和可组合性,使得代码更加简洁、灵活和易于维护。而链式调用的常用实现方式有:原生 Setter 方式、Lombok 的 @Accessors 注解或 @Builder 注解实现方式,或者使用 Hutool 工具中提供的 GenericBuilder 类都可以实现链式调用。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:面试官,调用,name,代码,Student,链式,age
From: https://www.cnblogs.com/vipstone/p/17900890.html

相关文章

  • 子类父类有相同的方法优先调用子类-重写-递归
    子类和父类有相同的方法,优先调用子类。如果子类没有,父类。packagestudyDemo9yue;publicclassstudy01{ publicstaticvoidmain(String[]args){ Sons1=newSon(); s1.test(); }}classFather{ voidtest(){ System.out.println("我是父类的test"); }}c......
  • 关于java的多态方法调用顺序的问题
    使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖);如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;注意特殊情况,如果该父类引用所调用的方法参数列表未定义,就调用该父类的父类中查找,如果还没找到就强......
  • 使用java调用Python脚本
    通过使用java中的ProcessBuilder类,可以实现在java代码中调用外部的python代码的功能,以下为具体代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassJavaCallPython{publicstaticvoidmain(String[]args)......
  • uniapp开发——纯原生渲染nvue调用uni.makePhoneCall没反应的处理办法
    uni.makePhoneCall(OBJECT)|uni-app官网(dcloud.net.cn)正常情况下,manifest.json配置拨打电话的权限就可以了:配置权限后重新打包,真机运行应该就可以正常的拨打电话了。如果API没反应,那么可以试试下边这种不弹出询问框直接拨打电话的方法:callMobile(){letmobile......
  • iframe父子页面通信相互调用传递参数多个postMessage
    效果如何运行父页面代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 调用阿里云的JDK刷脸认证是否是本人方法
    **1.访问阿里的文档**[https://help.aliyun.com/zh/id-verification/financial-grade-id-verification/integration-process-5?spm=a2c4g.11186623.0.0.45399de9HVHeSB]()**2.阅读其中的流程图**![](https://img2023.cnblogs.com/blog/3339321/202312/3339321-2023121309362655......
  • 系统调用的具体过程以及注意点【包含AIGC】
    以下内容包含AIGC,我已经甄别了一遍,但是难免疏漏,如果有问题,请联系我。内容System:YouareahelpfulAIassistant.User:请说明linux操作系统的系统调用过程的全过程,并配上必要的mermaid图解Assistant:在Linux操作系统中,系统调用是用户空间进程与内核空间通交流的主要方式。......
  • 面试官问我,try catch 应该在for循环里面还是外面?
    trycatch的位置是要根据具体情况来确定的。咱们先来说说for循环里面放trycatch的情况。当你的程序在for循环中可能会发生异常,但是这个异常并不是致命的,也不会影响整个循环的执行,那你就可以把trycatch放在for循环里面。举个例子吧,假设咱们要读取一个文件里的数据,然后进行处理。可......
  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • openFeign+sentinel 对远程调用熔断降级
    openFeign+sentinel对远程调用熔断降级需求:在member-service-nacos-consumer-80调用某个无效服务时,启动Sentinel的熔断降级机制,能够快速返回响应,而不是使用默认的超时机制(因为超时机制容易线程堆积,从而导致雪崩)异常场景1.两个服务都挂掉由于Customer它要定时从......