首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArchUnits layeredArchitecture规则不包括字段

ArchUnits layeredArchitecture规则不包括字段
EN

Stack Overflow用户
提问于 2019-05-27 07:42:13
回答 1查看 208关注 0票数 0

我们通过一些ArchUnit规则来检查我们的软件架构。

其中之一是对我们的分层架构的测试。

对于方法来说,这很好。如果我们从layer3访问layer1的方法,我们将得到一个异常。

但是,如果在layer3中从layer1声明了对字段的访问,这不会引发异常。

代码语言:javascript
复制
   .layer("layer1").definedBy("com.acme.layer1")
   .layer("layer2").definedBy("com.acme.layer2")
   .layer("layer3").definedBy("com.acme.layer3")
   .whereLayer("layer3").mayNotBeAccessedByAnyLayer()
   .whereLayer("layer2").mayOnlyAccessedByLayers("layer3")
   .as("Respect the layered architecture");

如果我们将字段从layer3导入到layer1类,则不会引发异常:

代码语言:javascript
复制
package com.acme.layer1

import static com.acme.layer3.SOME_LABEL

public class x {
   ...
}

我们的期望是,从任何其他层中的layer3访问字段也会引发异常。还是有别的办法检查?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-27 08:15:28

我的答案取决于这样一个假设:com.acme.layer3.SOME_LABEL是一个类似于public static final String SOME_LABEL = "..."常量表达式

编译时常量在编译期间内联.如果您的代码看起来像

代码语言:javascript
复制
String label = SharedConstants.SOME_LABEL;

然后编译的字节码包含SharedConstants.SOME_LABEL的确切值。在字节码中仍然没有提到这个字段。(静态最后的内嵌陷阱)

ArchUnit通过分析字节码收集所有信息,也见ArchUnit用户指南。因为字节码中没有关于SharedConstants.SOME_LABEL的信息,所以ArchUnit不知道这种访问。

总之:这是ArchUnit和所有仅依赖字节码的其他库的限制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56321724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档