左上方关注“Thinking曹”,勾选“设为星标”
沉淀、分享、持之以恒的学习
还是那句话,既然吃了面向对象编程这碗饭,能不重复造轮子就尽量不造,今天介绍一款Java开发工具包feilong-core
一、背景
在JAVA
开发过程中,经常看到小伙伴直接从网上copy
一长段代码来使用,又或者写的代码很长很长很长…
痛点在于:
-
难以阅读 -
难以维护 -
sonar扫描结果债务长 -
codereview 被小伙伴鄙视 -
….
feilong-core focus on J2SE
是feilong platform
的核心项目,创建于2008年
愿景: Reduce development,Release ideas (减少开发,释放思想), 希望可以减少书写重复且繁杂的代码,让你从大量重复的底层代码中脱身,提高工作效率;多思考业务的完整性,让你的代码更简炼,易写、易读、易于维护;
经过多个版本迭代,已经逐步走向稳定
二、feilong-core介绍
1. 简介:
-
让你从大量重复的底层代码中脱身,提高工作效率; -
让你的代码更简炼,易写、易读、易于维护;
2. feilong-core 优点:
使用 feilong-core 的理由
-
有常用的工具类 (如 小巧实用日期处理 – DateUtil ,集合处理利器 – CollectionsUtil 等) -
有常用的JAVA常量类 (如 常用时间模式 — DatePattern , 常用时间间隔 —TimeInterval 等) -
不必要的 Exception
转成了RuntimeException
,减少不必要的代码 -
国内 中文注释
最完善的API
-
有完善的单元测试
3. feilong-core亮点之处
-
有常用专属工具类 (如处理日期的 DateUtil
,处理集合的CollectionsUtil
,类型转换的ConvertUtil
等等等) -
有常用 JAVA
常量类 (如日期格式DatePattern
, 时间间隔TimeInterval
等等等) -
不必要的 Exception
转成RuntimeException
,减少不必要的代码 -
国内中文注释最完善的 API
-
有完善的单元测试
4. feilong-core工具包大全
5. 部分功能图解
三、feilong-core常用API操作
1. ConvertUtil操作集合工具类
以前调用某个api时,该api需要一个list参数,但是你现在只有单对象,这个场景你的代码会怎么写?
-
以前你要这么写:
List<Long> itemIds = new ArrayList<>();
itemIds.add(itemId);
sdkItemManager.findItemImageByItemIds(itemIds);
-
现在你可以这么写:
sdkItemManager.findItemImageByItemIds(ConvertUtil.toList(itemId));
使用ConvertUtil.toList()
方法,你只需要一行代码就可以搞定,代码简洁又清爽。
同样,下面的代码
-
以前你是这么写:
List<Long> skuIds = new ArrayList<>();
skuIds.add(9L);
skuIds.add(10L);
skuIds.add(13L);
skuIds.add(18L);
skuIds.add(20L);
BundleValidateResult result = bundleManager.validateBundle(skuIds);
-
现在你可以简写:
List<Long> skuIds=ConvertUtil.toList(9L, 10L, 13L, 18L, 20L);
BundleValidateResult result = bundleManager.validateBundle(skuIds);
代码的可读性更高,更简洁
2.CollectionsUtil.getPropertyValueList(Collection, String)
CollectionsUtil.getPropertyValueList(Collection<O>, String)
: 表示简化循环遍历集合,取到对象指定的属性 propertyName
的值,然后调用list.add()方法添加到集合中,拼成 List(ArrayList)
这一过程
比如: 要提取SalesOrderCommand list里面的id属性组成 List
-
以前你要这么写:
List<SalesOrderCommand> salesOrderList = sdkOrderDao.findOrdersWithOutPage(sorts, searchParam);
//...
List<Long> idList = new ArrayList<>(salesOrderList.size());
for (SalesOrderCommand cmd : salesOrderList){
idList.add(cmd.getId());
}
//查询订单行
List<OrderLineCommand> allLineList = sdkOrderLineDao.findOrderDetailListByOrderIds(idList);
-
现在你可以这么写:
List<SalesOrderCommand> salesOrderList = sdkOrderDao.findOrdersWithOutPage(sorts, searchParam);
//...
List<Long> idList =CollectionsUtil.getPropertyValueList(salesOrderList, "id");
//查询订单行
List<OrderLineCommand> allLineList = sdkOrderLineDao.findOrderDetailListByOrderIds(idList);
现在只需写CollectionsUtil.getPropertyValueList(salesOrderPage, "id")
这段代码,可以一行搞定 。
Tips: 相似的方法,还有CollectionsUtil.getPropertyValueSet(Collection<O>, String)
以及 CollectionsUtil.getPropertyValueMap(Collection<O>, String, String)
。
3. 不能不说的异常处理
众所周知,JAVA
有checked exception
和 uncheckedException
之分,也就是我们常说的 RuntimeException
和 Exception
。
checked exception
有其使用场景,但是我们日常开发过程中,并没有对他做特殊的代码处理
比如,大部分小伙伴的代码是这样的:
public ContactCommand toContactCommand(ContactCommand command) {
try {
BeanUtils.copyProperties(command, this);
} catch (Exception e){
log.error("", e);
//or e.printStackTrace();
}
return command;
}
其实细究下来,上述代码是不合理的, 如果转换的时候出现了异常,这里就会出现数据没有转换过去的情况,
这理论上是 RuntimeException
,但是org.apache.commons.beanutils.BeanUtils ``里面使用的是
Exception,所以小伙伴不能不
try… catch一下,可是
catch `代码里面有可能仅仅写了log记录,这有可能会出现逻辑问题 (本来需要抛出异常让事务回滚)。
这时可以使用com.feilong.core.bean.BeanUtil
public ContactCommand toContactCommand(ContactCommand command){
com.feilong.core.bean.BeanUtil.copyProperties(command, this);
return command;
}
当然,如果你确定copy的对象相同属性名称的类型是一致的,你可以使用 PropertyUtil
,可以有效的避免不必要的类型转换,提高效率
代码简洁,而且内部包装成的是自定义的 BeanOperationException(RuntimeException),如果需要特殊处理,依然可以 try…catch…
4. 有丰富的javadoc
调用方法的时候,可以清晰的感知这个方法的 作用
,示例
,说明点
,参数
,返回值
,异常
等信息。
-
源码示例:
/**
* 计算两个时间相差的的天数(<span style="color:red">绝对值</span>).
*
* <h3>说明:</h3>
* <blockquote>
* <p>
* 值=两个时间相差毫秒的绝对值/{@link TimeInterval#MILLISECOND_PER_DAY}
* </p>
* </blockquote>
*
* <h3>示例:</h3>
*
* <blockquote>
*
* <pre class="code">
* DateExtensionUtil.getIntervalDay(
* toDate("2008-08-24",COMMON_DATE),
* toDate("2008-08-27",COMMON_DATE)) = 3
*
* DateExtensionUtil.getIntervalDay(
* toDate("2016-08-21 12:00:00",COMMON_DATE_AND_TIME),
* toDate("2016-08-22 11:00:00",COMMON_DATE_AND_TIME)) = 0
*
* DateExtensionUtil.getIntervalDay(
* toDate("2016-08-21",COMMON_DATE),
* toDate("2016-08-22",COMMON_DATE)) = 1
*
* DateExtensionUtil.getIntervalDay(
* toDate("2016-02-28",COMMON_DATE),
* toDate("2016-03-02",COMMON_DATE)) = 3
*
* DateExtensionUtil.getIntervalDay(
* toDate("2016-08-31",COMMON_DATE),
* toDate("2016-09-02",COMMON_DATE)) = 2
*
* </pre>
*
* </blockquote>
*
* @param date1
* date1
* @param date2
* date2
* @return 如果 <code>date1</code> 是null,抛出 {@link NullPointerException}<br>
* 如果 <code>date2</code> 是null,抛出 {@link NullPointerException}
* @see #getIntervalTime(Date, Date)
* @see #getIntervalDay(long)
* @since 1.6.0
*/
public static int getIntervalDay(Date date1,Date date2){
return getIntervalDay(getIntervalTime(date1, date2));
}
如果你使用maven
的话,只需要在依赖的jar
右键,maven--> download javadoc
或者 download sources
会自动下载。
四、Maven使用配置
1. 如果你是导入jar包到工程
下载地址: https://github.com/venusdrogon/feilong-platform/tree/repository/com/feilong/platform/feilong-core
2. 如果你是Maven构建
-
pom.xml引入feilong-core及仓库地址
<project>
....
<properties>
<version.feilong-platform>2.1.0</version.feilong-platform>
....
</properties>
....
<repositories>
<repository>
<id>feilong-repository</id>
<url>https://raw.github.com/venusdrogon/feilong-platform/repository</url>
</repository>
</repositories>
....
<dependencies>
....
<dependency>
<groupId>com.feilong.platform</groupId>
<artifactId>feilong-core</artifactId>
<version>${version.feilong-platform}</version>
</dependency>
....
</dependencies>
....
</project>
3. feilong-util-all(全家桶,含IO操作,Net操作,Json,等工具类)
-
pom.xml引入feilong-util-all及仓库地址
<project>
....
<properties>
<version.feilong-platform>2.1.0</version.feilong-platform>
....
</properties>
....
<repositories>
<repository>
<id>feilong-repository</id>
<url>https://raw.github.com/venusdrogon/feilong-platform/repository</url>
</repository>
</repositories>
....
<dependencies>
....
<dependency>
<groupId>com.feilong.platform</groupId>
<artifactId>feilong-util-all</artifactId>
<version>${version.feilong-platform}</version>
</dependency>
....
</dependencies>
....
</project>
五、feilong依赖的第三方包
1. maven 依赖
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
</dependencies>
2. 你也可以自行下载:
-
commons-lang3
-
官方地址: http://commons.apache.org/proper/commons-lang/download_lang.cgi -
maven地址: http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22commons-lang3%22%20AND%20g%3A%22org.apache.commons%22 -
commons-collections4
-
官方地址: http://commons.apache.org/proper/commons-collections/download_collections.cgi
-
官方地址: http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22commons-collections4%22%20AND%20g%3A%22org.apache.commons%22
-
commons-beanutils
-
官方地址: http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi -
maven地址: http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22commons-beanutils%22%20AND%20a%3A%22commons-beanutils%22
六、feilong-core API大纲
七、参考
feilong-core: http://feilong-core.mydoc.io/
– END –
觉得文章还不错,按住下图二维码,关注公众号「Thinking曹」,架构路上太漫长,我们一起前行吧。
喜欢你就点个在看吧,点赞也可以来一下哦
原文始发于微信公众号(Thinking曹):feilong-core,一个让Java开发更简便的工具包,极力推荐
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/26892.html