本质还是普通对象,但是加上泛型后威力剧增!由于在方法定义时就强制了泛型约束,语义非常清晰,同时可以完全杜绝上述的无语义中间类,当然一些必要的,有业务含义的组装类,不建议使用这种方式。
泛型:我想new一个对象
想利用作为泛型约束,却需要new一个T,但是Java它new不出来啊 😂
之前写过一个通用的Java爬虫接口,里面有一个功能就是传入目标网页的即可获取到针对不同网页设计的Bean,大概如下所示:
public interface SpiderBeansHandle {
/** 获取Url **/
String getUrl();
/** 获取Cookie **/
String getCookie();
/** 获取CSS selector **/
String getSelector();
// …
}
中间关键的一点即如何获取到这个Bean,那个时候我只有一个想法:new 一个 T
事实证明,我过于天真了 🙄
但是换种思路,既然new不出来,那我就返回一下吧,于是代码出炉了~
public interface SpiderBeansHandle {
/**
- 获取Url
*/
String getUrl();
/**
- 获取Cookie
*/
String getCookie();
/***
- 获取CSS selector
*/
String getSelector();
/***
-
解析Element
-
@param element element
*/
T parseElement(Element element);
/***
-
Get Beans
-
@param handle Bean对象 | handle对象
-
@param Bean类型
-
@return List
*/
static List getBeans(SpiderBeansHandle handle) {
List list = new ArrayList<>();
List elements = SpiderUtils.getElementWithCookie(handle.getUrl(), handle.getSelector(), handle.getCookie());
for (Element element : elements) {
T bean = handle.parseElement(element);
if (bean != null) {
list.add(bean);
}//加入Java开发交流君样:756584822一起吹水聊天
}
return list;
}
}
关键一步就在于:
/***
-
解析Element
-
@param element element
*/
T parseElement(Element element);
那么这个小技巧有什么用呢?仔细看会不会觉得它像一种设计模式的变形体?没错!真相只有一个:模板方法模式
我需要一个处理爬虫的通用接口,因为简单爬虫无非就是拿到url然后请求,解析细节封装到自身的Bean里,然后获取一个列表,那么在开发业务代码的时候类似,肯定有某些场景和需求具有高度的一致性,那么使用这种设计方案即可大大的减少重复代码~
方法:你到底想干嘛?
咱们在写代码的时候有没有遇到过这种问题?写了一个工具类方法,但是功能又过于单一,虽说单一原则好吧,但是一个小逻辑写一堆方法,总感觉不得劲,如何解决咧?
Java8提供的函数式编程即可帮我们一定程度上解决这种问题,如:
// 写一个获取文件列表,且判断是否为txt结尾的工具类方法,新手会这么写
public static File getFileWithTxt(String path) throws IOException {
File file = new File(path);
if (!file.exists()) {
throw new IOException(“File is not exist.”);
}
if (file.getName().endsWith(“.txt”)) {
return file;
}
return null;
}//加入Java开发交流君样:756584822一起吹水聊天
老手一般会把 .txt 作为参数传入,但是某一天我需要判断文件大小,文件长度,甚至是文件内容的时候,我该咋办?再写N个?
最好的方案即传入 Predicate 谓词,让调用者自定义处理逻辑,然后再把最常用的逻辑基于该方法复写一下,拓展性Max!代码如下:
/***
-
文件夹谓词匹配
-
@param file 文件
-
@param predicate 谓词匹配
-
@return List
-
@throws IOException IOException
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
最新整理电子书
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算