转载

科学的引用类名和包名

近期重构项目的时候,不可避免的修改了包名,出现了服务无法注册,函数没有加载等问题。溯其根源是这些扫描注册的模块直接引用了类的字符串的硬编码,编译期无法检测出来。

2. 直接字符串引用包名/类名的缺陷

  1. 修改包名/类名时,IDE无法找出字符串引用并修改;
  2. 修改包名/类名后,相关的错误无法通过编译检测出来;

3. 原因

1)粗心设计,没考虑修改时引起的不便; 2)模块结构不规范,需要引用的类不在自己的依赖范围; 例如模块B,C是平行关系,互相不依赖。此时如果B要应用C中的某个类,则只能通过字符串来引用才能避免编译器报错。 本情况需要考虑把B依赖的部分,抽到公共模块,被B,C共享。

A
  /    /
B        C
复制代码

4. 科学引用类名/包名

1)示例一:设计欠考虑 注解Service第二个参数使用字符串来指定类。

  • 不科学代码
@XStreamAlias("jsf")
@Service(type = "jsf", provider = "com.jd.edi.service.provider.JsfServiceProvider")
@Node(name = "jsfService", desc = "JSF服务", isStart = true)
public class JSfProviderConf extends AbstractProviderConfig {
  ...
}

复制代码
  • 修正代码 把Service的第二个参数修改为Class类型。
@XStreamAlias("jsf")
@Service(type = "jsf", provider = JsfServiceProvider.class)
@Node(name = "jsfService", desc = "JSF服务", isStart = true)
public class JSfProviderConf extends AbstractProviderConfig {
  ...
}

复制代码

2)示例二:模块结构不合理 依赖了不在依赖范围的包

  • 不科学代码
JarScanUtil.scan("com.jd.edi.function");
复制代码
  • 修正代码 抽取该包及其子类到公共依赖
JarScanUtil.scan(CommonFunction.class.getPackage().getName());
复制代码
原文  https://juejin.im/post/5ead0e3ce51d454dcb3a9625
正文到此结束
Loading...