泛型用的好,下班走得早

简介:

泛型方法和类允许程序员编写高级化的单个方法或类,以用于不同的类型。

泛型方法和类允许程序员编写高级化的单个方法或类,以用于不同的类型。

我们每天都在使用它们,例如List ,Stream ,Map …

泛型类是普通类,其类名后跟一个类型参数部分。这些类称为参数化类或参数化类型,因为它们接受一个或多个参数。

特征:

  • 类型安全:泛型中只能容纳一种类型的对象。
  • 不需要类型转换:无需类型转换对象。
  • 编译时检查:在编译时进行检查,因此在运行时不会发生此问题。好的编程策略表明,在编译时处理问题比运行时要好得多。

类型参数命名约定:

  • T type
  • E element
  • K Key
  • N Number
  • V value

泛型通配符:

我们知道 ? 是通配符,它表示任何类型。如果我们写<? extends Number>,我们接受Number的任何子类,例如Integer,Float和double。

我们可以使用通配符作为参数,字段,返回类型或局部变量的类型。但是,不允许将通配符用作泛型方法调用,泛型类实例创建或超类型的类型参数。

通用类示例:

public class Response<T> {
 private List<T> data;
 private Integer page;
 private Integer elements;
}

在第一个简单示例中,我们创建了一个通用类Response,将用于返回分页的结果。我们不需要做魔术,也不必创建其他类。

如何写更少的代码?

尽管泛型在库中使用非常广泛,但是我看到很少有程序员使用泛型来泛化代码,例如,您有多少次看到控制器,服务和存储库几乎在做同样的事情?

在介绍完之后,我希望您展示一个简单的示例,说明如何编写一次性代码并在多个类中使用它。

一个简单的项目

在此示例中,我想向您展示如何定义BaseService和GeneralRepository来处理Java服务中的常见操作。

BaseEntity.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseEntity {
    @Id
    protected String id;
    protected String tenantId;
    protected Date creationDate;
    protected Date updateDate;
}

我们正在创建一个简单的类,该类在我们的类中包含commons属性,下一个代码段将很有必要。

BaseRepository

@Repository
public interface GenericRepository<E extends BaseEntity> extends ReactiveCrudRepository<E, String> {
    Mono<Void> deleteByIdAndTenantId(String id, String tenantId);
    Mono<E> findFirstByIdAndTenantId(String id, String tenantId);
}

这是基本存储库,其中包含对我们的BaseEntity类的子类的常见查询。

BaseService

@Service
@Slf4j
public class BaseService<E extends BaseEntity> {

    @Autowired
    protected GenericRepository<E> generalRepo;

    public Mono<E> findEnitity(String entityId, String tenantId) {
        return generalRepo.findFirstByIdAndTenantId(entityId,tenantId);
    }

    public Mono<Void> delete(String entityId, String tenantId) {
        return findEnitity(entityId, tenantId)
                .switchIfEmpty(Mono.error(new NotFoundException(ITEM_NOT_FOUND)))
                .flatMap(e -> generalRepo.deleteByIdAndTenantId(e.getId(),e.getTenantId()));
    }
    
    public Mono<E> saveEntity(String tenantId, E entity) {
        entity.setTenantId(tenantId);
        return generalRepo.save(entity);
    }

    public Mono<E> updateEntity(String entityId, String tenantId,E entity) {
        return findEnitity(entityId,tenantId)
                .map(u -> saveEntity(tenantId,entity))
                .switchIfEmpty(Mono.error(new Exception(ITEM_NOT_FOUND)))
                .flatMap(m -> m);
    }
}

所有服务将继承BaseService继承继承的保存,更新,查找和删除方法,这些方法执行通用操作以将我们的数据持久保存在数据库中。显然,这段代码非常简单,您可以编写一种处理分页请求的方法,在执行插入/更新之前添加检查。

BaseController

public class BaseController<E extends BaseEntity> {

    @Autowired
    private BaseService<E> baseService;

    @PostMapping("/save")
    public Mono<E> save(Authentication auth,
                        @RequestBody E entity) {
        return baseService.save(getTenant(auth),entity);
    }
    
}

让我们以允许在多个控制器之间共享公共端点的BaseController结束该示例。

总结

因此,我们对泛型进行了一些小小的更新,并看到了如何编写更少的代码来使多个类之间的通用操作更加温和。

目录
相关文章
|
人工智能 自然语言处理 搜索推荐
Perplexity AI和秘塔AI相比如何?
【2月更文挑战第16天】Perplexity AI和秘塔AI相比如何?
2481 1
Perplexity AI和秘塔AI相比如何?
|
存储 自然语言处理 NoSQL
6.4K star!轻松搞定专业领域大模型推理,这个知识增强框架绝了!
🔥「垂直领域大模型落地难?逻辑推理总出错?这个来自OpenSPG的开源框架,让专业领域知识服务变得像搭积木一样简单!」
888 3
|
9月前
|
人工智能 算法 搜索推荐
AI 英语口语 APP 开发的技术
2026 AI英语口语APP已迈入“极致体验”时代:全双工实时交互(&lt;100ms ASR延迟)、GPT-4o级拟人TTS、音素级发音评测+嘴型视觉纠正、RAG增强地道表达、向量记忆个性化教学。技术核心在于低延迟链路、幻觉管控与多模态对齐。(239字)
|
数据采集 安全 数据安全/隐私保护
微信加人要安全验证怎么回事
微信好友添加安全验证机制的技术解析 作为拥有12亿月活的国民级应用
|
存储 机器学习/深度学习 人工智能
AI Agent技术的最新进展与改变世界的典型项目巡礼
【7月更文挑战第3天】 AI Agent技术的最新进展与改变世界的典型项目巡礼
 AI Agent技术的最新进展与改变世界的典型项目巡礼
|
前端开发 关系型数据库 数据库
Django 后端架构开发:虚拟环境管理到项目搭建
Django 后端架构开发:虚拟环境管理到项目搭建
524 1
|
网络协议 Shell 网络安全
docker容器网络问题
【10月更文挑战第4天】
2181 2
|
人工智能 自然语言处理 API
阿里云上的IaC和自动化
本文介绍了阿里云上的自动化与基础设施即代码(IaC)的整体情况。阿里云提供了2万多个API,每日调用量达300亿次,同比增长40%。文中探讨了自动化集成的方式,包括通过API、SDK和IaC工具,并分析了不同场景下的选择策略。对于资源管理较少的企业,控制台界面更合适;而对于高频变更和复杂操作,API和IaC是更好的选择。此外,文章还提到了低代码/无代码解决方案及AI在IaC和自动化中的应用前景。
|
算法 搜索推荐 数据可视化
Beta分布与汤普森采样:智能决策系统概率采样的理论基础
在现代技术领域,算法决策优化成为核心竞争力的关键。Meta、Netflix和亚马逊等公司通过广告位置、缩略图及产品推荐的优化,显著提升了用户体验和商业效益。这些优化背后的共同点是采用了基于Beta分布的汤普森采样算法,有效解决了决策系统中探索与利用的平衡问题。通过从概率分布中随机采样来做出决策,汤普森采样不仅保证了对已知良好选项的充分利用,还维持了对潜在更优选项的探索,从而在实践中实现了高效且自适应的决策过程。
764 8