泛型用的好,下班走得早
泛型方法和类允许程序员编写高级化的单个方法或类,以用于不同的类型。
泛型方法和类允许程序员编写高级化的单个方法或类,以用于不同的类型。
我们每天都在使用它们,例如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结束该示例。
总结
因此,我们对泛型进行了一些小小的更新,并看到了如何编写更少的代码来使多个类之间的通用操作更加温和。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
请停止编写这么多的for循环!
在这篇文章中,我想和你一起回到基础知识,并讨论 Java 中的 for 循环。老实说,我正在为自己写这篇博客文章,因为我也会这样做。从 Java 8 开始,我们不必在 Java 中编写太多 for 循环!我希望这篇文章将使你的代码更易于阅读和编写。 你需要 for 循环做什么? 一般地说,for 循环执行两类任务: 遍历集合 运行算法 对于算法,for 循环可能是合适的。看一下此算法,检查数字是否为三的幂: double number = 81; for(; number > 1; number /=3); return number == 1; 在这里,for 循环是合适的。这是一个非常简单的示例,你可以想象,使用更困难的算法会变得更加棘手。 对于大多数开发人员而言,在他们的日常工作中,这种情况很少。大多数时候,我们使用 for 循环遍历集合。让我们看一下该代码的一些示例。 遍历 Java 中的集合 我们首先来定义一个 List 数组,并往里面插入一些元素: List<String> heroes = new ArrayList<>(); heroes....
- 下一篇
backup-db 0.0.4 发布,在 Docker 中运行的数据库备份工具
原理:在原生的docker镜像基础上,加入一备份工具,增强备份功能。 提供postgres, mysql5镜像,可直接使用,如有需要请提issues。 本次更改: 参考tls实现加密传输备份文件到服务端,rsa非对称交换密钥 + aes-gcm对称加密(每次随机密码+固定验证密码) 修复刪除旧的备份文件发生的异常 脚本权限修改为0700 现有功能: 可以自行构建docker镜像,支持不同的数据库及不同的版本,如mysql8, oracle, sqlserver2017+等等 支持自定义命令 可以把备份后的文件存入另一台服务器 备份失败邮件通知 每日凌晨自动备份 可设置备份文件最大保存天数(最少3天) 参考tls实现加密传输备份文件到服务端,rsa非对称交换密钥 + aes-gcm对称加密(每次随机密码+固定验证密码) 项目地址: https://gitee.com/jeessy/backup-db https://github.com/jeessy2/backup-db docker地址: https://hub.docker.com/r/jeessy/backup-db
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路