我是Sonar和Weld / CDI的新手。我希望您的帮助能够通过Weld / CDI进一步提供有关LCOM4分析结果的建议。首先,我创建一个简单的java类,如下所示: -
-------------源---------------
interface MyInterface1 {
String getName();
void setName(String name);
}
interface MyInterface2 extends MyInterface1 {
String getPhone();
void setPhone();
}
public interface MyPublishedInterface extend MyInterface1, MyInterface2 {
//There is no any definition, it just a collected capabilities
//which will be published to other package. Some capabilities
//may be hidden and use internally.
}
abstract class MyBean1 implements MyInterface1 {
private String name;
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String theName) {
this.name = theName;
}
}
abstract class MyBean2 extends MyBean1 implements MyInterface2 {
private String phone;
@Override
public String getPhone() {
return this.phone;
}
@Override
public void setPhone(String thePhone) {
this.phone= thePhone;
}
}
public class MyPublishedBean extends MyBean2 implements MyPublishedInterface {
//There is no any coding, it just a collected capabilities
//which will be published to other package. Some capabilities
//may be hidden and use internally.
}
@Named
@RequestScope
public class MyBackingBean {
@Inject
private MyPublishedInterface myPublishedInterface;
//-----the business method, setter and getter here.
}
-------------源---------------
在我使用Sonar进行分析后,它报告MyPublishedBean的LCOM4> 1
- getPhone()Ljava /郎/字符串;
- 的setName(Ljava /郎/字符串;)V
- setPhone(Ljava /郎/字符串;)V
- 的getName()Ljava /郎/字符串;
醇>
以前我曾经将所有方法都标记为“最终”方法,没有任何关于LCOM4的提及。无论如何,系统向我显示了关于Unproxyable的异常,因为我的类包含final方法。我已经删除了“最终”,我遇到了LCOM4问题。
我不确定我是否对Sonar,Weld / CDI,类/界面设计或所有这些都感到困惑。你能帮忙进一步提出建议吗?
答案 0 :(得分:4)
声纳文档很好地解释了LCOM4。根据您在此处给出的示例,您看到的结果完全正确。
这些界面看起来就像是没有逻辑的数据持有者。只有getter和setter属性的bean才能完全期望LCOM值等于bean中的属性数。 LCOM4是一个衡量一个类中逻辑的内聚力的指标。纯数据bean的逻辑只是数据在某种程度上彼此相关。因此,在这种情况下,LCOM4是一个不正确且误导性的指标。
LCOM4也应完全独立于您的方法是否为最终方法。
请注意LCOM4> 1表示可疑类。这并不意味着该类是错误的,不应该用于将类标记为坏。一旦发现可疑类是正常的,最好以某种方式从度量标准中删除该类(以避免构建一长串警告,您应该忽略这些警告)。