科学的引用类名和包名
1. 背景
近期重构项目的时候,不可避免的修改了包名,出现了服务无法注册,函数没有加载等问题。溯其根源是这些扫描注册的模块直接引用了类的字符串的硬编码,编译期无法检测出来。
2. 直接字符串引用包名/类名的缺陷
- 修改包名/类名时,IDE无法找出字符串引用并修改;
- 修改包名/类名后,相关的错误无法通过编译检测出来;
3. 原因
1)粗心设计,没考虑修改时引起的不便;
2)模块结构不规范,需要引用的类不在自己的依赖范围;例如模块B,C是平行关系,互相不依赖。此时如果B要应用C中的某个类,则只能通过字符串来引用才能避免编译器报错。本情况需要考虑把B依赖的部分,抽到公共模块,被B,C共享。
1 | A |
4. 科学引用类名/包名
1)示例一:设计欠考虑
注解Service第二个参数使用字符串来指定类。
不科学代码
1
2
3
4
5
6
public class JSfProviderConf extends AbstractProviderConfig {
...
}修正代码
把Service的第二个参数修改为Class类型。1
2
3
4
5
6
public class JSfProviderConf extends AbstractProviderConfig {
...
}
2)示例二:模块结构不合理
依赖了不在依赖范围的包
不科学代码
1
JarScanUtil.scan("com.jd.edi.function");
修正代码
抽取该包及其子类到公共依赖1
JarScanUtil.scan(CommonFunction.class.getPackage().getName());