目前正在开发用于单个赋值的代码气味检测器。我做了一个抽象的codesell类,有两个具体的子类- ClassLevelSmell和MethodLevelSmell。CodeSmell类有一个SmellType类型的受保护字段。构造函数示例如下:
public ClassLevelSmell(ClassDefinition classDef, SmellType type){
smellyClass = classDef;
this.smell = type;
}
SmellType是我定义的enum,看起来像这样:
public enum SmellType {
LONG_CLASS, LONG_METHOD, PRIMITIVE_OBSESSION, LONG_PARAM_LIST}
然后我有一个SmellDetector对象,其中有许多方法可以比较所分析的类和方法的统计信息(例如它们的行数,原语声明的数量等),并在发现气味时创建一个新的CodeSmell对象。我的代码是这样的:
private void detectLongClass(ClassDefinition classDef) {
if(classDef.getNumLines() > 250){
smells.add(new ClassLevelSmell(classDef, LONG_CLASS));
}
}
每个SmellDetector对象都有一个字段smell ,一个CodeSmells的数组列表。然而,当我试图将SmellType LONG_CLASS传递给ClassLevelMethod的构造函数时,我在eclipse中得到编译器警告,告诉我"LONG_CLASS不能解析为变量"。我是否在使用枚举类型时犯了一些错误?做什么?
要引用枚举值,您要么需要使用带有类名的限定表单,要么使用静态导入。所以要么改成:
smells.add(new ClassLevelSmell(classDef, SmellType.LONG_CLASS));
或者这样做:
// at the top of your file:
import static packagename.SmellType.*;
smells.add(new ClassLevelSmell(classDef, LONG_CLASS));
试试这个:
smells.add(new ClassLevelSmell(classDef, SmellType.LONG_CLASS));