讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Java通用方法优化:利用抽象父类处理相似请求对象

秋浩君_8021

秋浩君_8021

发布时间:2025-09-23 10:15:02

|

465人浏览过

|

来源于php中文网

原创

Java通用方法优化:利用抽象父类处理相似请求对象

本文探讨了在Java中,当多个请求对象具有相似结构且需要应用相同业务逻辑(如验证)时,如何通过引入抽象父类来消除代码冗余。通过将共享字段和行为上移至抽象父类,并利用多态性,可以显著减少方法重载,提升代码的可维护性、可扩展性和可读性,从而避免重复编写相同的验证逻辑。

优化相似请求对象的通用处理逻辑

在软件开发中,我们经常会遇到这样的场景:多个数据传输对象(dto)或请求对象在结构上高度相似,并且需要经过相同的业务逻辑处理,例如数据验证。如果为每个相似的请求对象都编写一个独立的处理方法,即使这些方法的内部逻辑完全相同,也会导致大量的代码重复,降低代码的可维护性和可读性。

考虑以下两个Java record 类型,它们分别用于创建和更新对象:

public record CreateObjectRequest (
    CustomObjectA a,
    CustomObjectB b,
    CustomObjectC c
) {}

public record UpdateObjectRequest (
    CustomObjectA a,
    CustomObjectB b
) {}

如果我们需要对这两个请求对象执行相同的验证逻辑,一个常见的做法是为它们分别创建重载的验证方法:

public class RequestValidator {
    public void validateRequest(CreateObjectRequest createObjectRequest) {
        // 大量相同的验证逻辑...
        System.out.println("Validating CreateObjectRequest...");
        // 示例:检查a和b是否为空
        if (createObjectRequest.a() == null) {
            throw new IllegalArgumentException("CustomObjectA cannot be null for CreateObjectRequest.");
        }
        if (createObjectRequest.b() == null) {
            throw new IllegalArgumentException("CustomObjectB cannot be null for CreateObjectRequest.");
        }
        // ... 其他验证
    }

    public void validateRequest(UpdateObjectRequest updateObjectRequest) {
        // 同样大量的验证逻辑...
        System.out.println("Validating UpdateObjectRequest...");
        // 示例:检查a和b是否为空
        if (updateObjectRequest.a() == null) {
            throw new IllegalArgumentException("CustomObjectA cannot be null for UpdateObjectRequest.");
        }
        if (updateObjectRequest.b() == null) {
            throw new IllegalArgumentException("CustomObjectB cannot be null for UpdateObjectRequest.");
        }
        // ... 其他验证
    }
}

这种方法虽然功能上可行,但显然存在代码冗余。当验证逻辑变得复杂或需要修改时,必须在多个地方进行同步更新,极易出错。

利用抽象父类实现代码复用

为了解决上述问题,我们可以利用Java的面向对象特性,特别是抽象类和继承,来消除这种冗余。核心思想是识别出所有相似请求对象共有的字段和行为,并将它们抽象到一个共同的父类中。

立即学习“Java免费学习笔记(深入)”;

1. 定义抽象父类

首先,创建一个抽象父类,例如 ObjectRequest,它包含所有子请求类型共享的字段。

// 假设 CustomObjectA 和 CustomObjectB 的基类或接口是 CustomObject
public abstract class ObjectRequest {
    protected CustomObject a;
    protected CustomObject b;

    // 构造函数、getter/setter(如果需要)
    public CustomObject getA() {
        return a;
    }

    public CustomObject getB() {
        return b;
    }
}

注意事项:

  • 这里将 CustomObjectA 和 CustomObjectB 统一为 CustomObject,前提是它们具有共同的父类或接口,或者我们可以通过类型擦除来处理。在实际应用中,如果 CustomObjectA 和 CustomObjectB 是完全独立的类型但只是字段名相同,则需要考虑更复杂的泛型或接口方案。但根据问题描述,它们是“同样的字段”,暗示可以抽象。
  • 字段声明为 protected 或 public,以便子类可以访问或通过 getter 方法提供访问。

2. 子类继承抽象父类

接下来,让具体的请求对象(如 CreateObjectRequest 和 UpdateObjectRequest)继承这个抽象父类。由于Java record 类型不能直接继承类,我们可以将 record 改为普通的 class,或者在 record 内部通过组合来引用父类的逻辑(但这样就失去了继承带来的多态便利)。为了实现继承带来的多态性,我们通常会选择将 record 转换为普通 class。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
// CreateObjectRequest 继承 ObjectRequest
public class CreateObjectRequest extends ObjectRequest {
    private CustomObjectC c; // CreateObjectRequest 特有的字段

    public CreateObjectRequest(CustomObjectA a, CustomObjectB b, CustomObjectC c) {
        this.a = a; // 从父类继承的字段
        this.b = b; // 从父类继承的字段
        this.c = c;
    }

    public CustomObjectC getC() {
        return c;
    }
}

// UpdateObjectRequest 继承 ObjectRequest
public class UpdateObjectRequest extends ObjectRequest {
    // UpdateObjectRequest 没有特有的字段,或者有其他特有字段
    public UpdateObjectRequest(CustomObjectA a, CustomObjectB b) {
        this.a = a; // 从父类继承的字段
        this.b = b; // 从父类继承的字段
    }
}

注意: 这里的 CustomObjectA 和 CustomObjectB 类型在 ObjectRequest 中被统一为 CustomObject。如果 CustomObjectA 和 CustomObjectB 本身不是 CustomObject 的子类,但它们都具有某些共同的属性,那么 ObjectRequest 中的 a 和 b 可以声明为它们的共同接口或基类类型。为了简化,这里假设 CustomObjectA 和 CustomObjectB 都可以被 CustomObject 类型引用。

3. 重构通用处理方法

现在,验证方法只需要接受抽象父类 ObjectRequest 作为参数。通过多态性,这个方法就可以处理所有继承自 ObjectRequest 的子类实例。

public class RequestValidator {
    public void validateRequest(ObjectRequest objectRequest) {
        // 通用的验证逻辑,现在只需要编写一次
        System.out.println("Validating generic ObjectRequest...");

        // 访问父类中的共享字段
        if (objectRequest.getA() == null) {
            throw new IllegalArgumentException("CustomObjectA cannot be null.");
        }
        if (objectRequest.getB() == null) {
            throw new IllegalArgumentException("CustomObjectB cannot be null.");
        }

        // 如果需要针对特定子类进行额外验证,可以使用 instanceof
        if (objectRequest instanceof CreateObjectRequest createRequest) {
            System.out.println("Performing CreateObjectRequest specific validation.");
            if (createRequest.getC() == null) {
                throw new IllegalArgumentException("CustomObjectC cannot be null for CreateObjectRequest.");
            }
        } else if (objectRequest instanceof UpdateObjectRequest updateRequest) {
            System.out.println("Performing UpdateObjectRequest specific validation.");
            // 针对 UpdateObjectRequest 的特有验证
        }
        // ... 其他通用验证
    }
}

通过这种方式,我们成功地将重复的验证逻辑集中到一个方法中。当需要修改或扩展通用验证逻辑时,只需修改 validateRequest(ObjectRequest objectRequest) 方法即可,大大提高了代码的可维护性和可扩展性。

总结与最佳实践

利用抽象父类来优化通用方法是Java中一种强大的代码复用模式。它适用于以下场景:

  • 多个类共享大量相同的字段和行为:这些类在概念上属于同一类事物,但有各自的特有属性。
  • 需要对这些相似类执行相同的操作:例如验证、序列化、转换等。

优点:

  • 减少代码冗余:避免重复编写相同的业务逻辑。
  • 提高可维护性:逻辑修改只需在一个地方进行。
  • 增强可扩展性:新增的相似请求类型只需继承抽象父类,即可自动获得通用处理能力。
  • 改善可读性:代码结构更清晰,意图表达更明确。

注意事项:

  • 过度抽象:如果类之间的共同点非常少,或者强行将不相关的类抽象到一起,可能会导致设计过于复杂,反而降低可读性。
  • 继承的局限性:Java是单继承语言,如果一个类已经继承了其他类,就不能再通过继承这种方式来复用通用逻辑。此时可以考虑接口结合默认方法、组合模式或泛型等其他设计模式。
  • record 类型的限制:record 类型在Java 16+中引入,其设计目标是作为不可变的数据载体,不能继承其他类(但可以实现接口)。因此,如果需要利用继承实现多态,可能需要将 record 转换为传统的 class。

通过合理运用抽象和继承,开发者可以编写出更优雅、更健壮、更易于维护的Java代码。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

7555

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

384

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

263

2026.04.17

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3228

2023.10.19

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn